#define _CRT_SECURE_NO_WARNINGS_ #include<stdio.h> intfind_num(int arr[3][3], int r, int c, int k) { int x = 0; int y = c - 1; while (x < c && y >= 0) { if (arr[x][y] < k) x++;//加一行 elseif (arr[x][y] > k) y--;//去一列 else return1; } return0; } intmain() { int a[3][3] = { 1,2,3, 4,5,6, 7,8,9 }; //查找一个数字,比如7 //可以遍历但时间复杂度就变为O(N^2) //O(1):不管几个元素都是遍历常数次 int k = 7; //如果找到返回1,否则返回0 int ret = find_num(a, 3, 3, k); if (ret == 1) printf("找到了\n"); else printf("找不到\n");
return0; }
如果要返回坐标怎么办(return只能返回一个值)怎么改
#define _CRT_SECURE_NO_WARNINGS_ #include<stdio.h> intfind_num(int arr[3][3], int *px, int *py, int k) { int x = 0; int y = *py - 1; while (x < *px && y >= 0) { if (arr[x][y] < k) x++;//加一行 elseif (arr[x][y] > k) y--;//去一列 else { *px = x; *py = y; return1; } } return0; } intmain() { int a[3][3] = { 1,2,3, 4,5,6, 7,8,9 }; int k = 7; int x = 3;//行 int y = 3;//列 /* &x,&y 1.传入参数 2.带回值 */ int ret = find_num(a, &x, &y, k); if (ret == 1) { printf("找到了\n"); printf("下标是:%d %d", x, y); } else printf("找不到\n");
return0; }
字符串左旋
题目内容:
实现一个函数,可以左旋字符串中的k个字符
例:
ABCD左旋第一个字符得到BCDA
ABCD左旋两个字符得到CDAB
#include<stdio.h> #include<string.h> voidstring_rotate(char* str, int k) { int i = 0; int len = strlen(str); for (i = 0; i < k; i++) { //每次左旋一个字符 char tmp = *str;//首地址 // 把后面的n-1个字符往前挪 int j = 0; for (j = 0; j < len - 1; j++) { *(str + j) = *(str + j + 1); } //tmp再放到最后 *(str + len - 1) = tmp; } } intmain() { char arr[10] = "ABCDEF"; int k; scanf("%d", &k); string_rotate(arr, k); puts(arr); return0; }
神奇的方法
比如A B C D E F k = 2 先逆序 A B 再逆序D E F 得到 B A F E D 再整体逆序得到 D E F A B 神奇 代码实现加个之前写过的逆序即可
#include<stdio.h> #include<string.h> #include<assert.h> voidreverse(char* left, char* right) { assert(left); assert(right); while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } voidstring_rotate(char* str, int k) { assert(str); int n = strlen(str); reverse(str, str + k - 1);//左 reverse(str + k, str + n - 1);//右 reverse(str, str + n - 1);//整体 }