指针与字符串相关练习题
【摘要】 一.杨氏矩阵我们要考虑时间复杂度问题小于o(N)说明循环次数不能为双for#include<stdio.h>int search(int arr[3][3], int *px, int *py, int k){ int x = 0; int y = *py - 1;//最后一列的坐标 while (x <= *px - 1 && y >= 0) { if (arr[x][y] <k)//...
一.杨氏矩阵
我们要考虑时间复杂度问题
小于o(N)说明循环次数不能为双for
#include<stdio.h>
int search(int arr[3][3], int *px, int *py, int k)
{
int x = 0;
int y = *py - 1;//最后一列的坐标
while (x <= *px - 1 && y >= 0)
{
if (arr[x][y] <k)//如果第N行最后一个列的元素值比K还小 说明K值必在下面
{
x++;
}
else if(arr[x][y]>k)//如果第N+1行最后一列的元素比K值大 说明K值有可能在它左边
{
y--;
}
else
{
*px = x;//将坐标传递回去
*py = y;
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
int k = 8;
int x = 3;
int y = 3;
int ret=search(arr, &x, &y,k);//将行x 列y分别进行传址调用 在函数中对应坐标位置可以传回来
if (ret == 1)
{
printf("找到了\n%d %d",x,y);
}
else
{
printf("没找到\n");
}
return 0;
}
二.字符串左旋
1.
#include<stdio.h>
#include<string.h>
void rotate(char* str, int k)
{
int i = 0;
int j = 0;
char tmp = 0;
int len = strlen(str);
for (i = 0; i < k; i++)//根据要左旋次数确定循环次数
{
tmp = *str;//将第一个字符赋给tmp
for (j = 0; j < len - 1; j++)//将后面的字符依次向前赋值
{
*(str+j)= *(str + j+1);
}
str[len - 1] = tmp;//最后一位字符被tmp赋值
}
}
int main()
{
char arr[] = "ABCD";
int k = 1;
rotate(arr,k);
printf("%s\n", arr);
return 0;
}
2.三步翻转法
#include<stdio.h>
#include<string.h>
void reverse(char* left, char* right)//两者交换
{
while (left < right)
{
char tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "ABCD";
int k = 2;
int len = strlen(arr);
reverse(arr, arr + k - 1);//将要翻转的字符逆序
reverse(arr + k, arr + len - 1);//剩余的字符逆序
reverse(arr, arr + len - 1);//整体逆序
printf("%s\n", arr);
return 0;
}
三.字符串旋转结果
#include<stdio.h>
#include<string.h>
int rotate(char* str, char*str2)
{
int i = 0;
int j = 0;
char tmp = 0;
int len = strlen(str);
for (i = 0; i < len; i++)//根据要左旋次数确定循环次数
{
tmp = *str;//将第一个字符赋给tmp
for (j = 0; j < len - 1; j++)//将后面的字符依次向前赋值
{
*(str + j) = *(str + j + 1);
}
str[len - 1] = tmp;//最后一位字符被tmp赋值
if (strcmp(str, str2) == 0)//如果两个字符串相等
{
return 1;
}
}
return 0;
}
int main()
{
char arr1[] = "AABCD";
char arr2[] = "BCDAA";
int ret=rotate(arr1, arr2);//左旋即可判断所有情况
if (ret == 1)
{
printf("是\n");
}
else
{
printf("否\n");
}
return 0;
}
四.颠倒字符串
#include<stdio.h>// i love you.-----.uoy evol i----- you love i
#include<string.h>
void swap(char* left, char* right)//两者交换
{
while (left < right)
{
char tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "i love you.";
int len = strlen(arr);
swap(arr, arr + len - 1);
char* dest = arr;
char* src = arr;
while (*src!='\0')
{
while (*src != ' '&&*src!='\0')
{
src++;
}
char* prev = src - 1;
swap(dest, prev);
if (*src != '\0')
{
src++;
}
dest = src;
}
printf("%s\n", arr);
return 0;
}
主要应用三步翻转法
i love you.
首先 将整体翻转 .uoy evol i
再将每个进行翻转 : .uoy----you. evol----love i-----i
再开始的时候定义两个指针 dest src
想使用 dest 指向每个小整体字符的第一个
src指向每个小整体字符的最后一个
在循环中触发为 src指向 ’ '或者 ‘\0’
prev是为了找到它的前一个 即每个小整体字符的最后一个
src++后 指向新的小整体字符的第一个再次循环即可
src++时我们可以发现若最后'\0'进来不++
在while循环判断就会结束
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)