@TOC
一.杨氏矩阵
在这里插入图片描述
我们要考虑时间复杂度问题
小于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循环判断就会结束