本文章写于2023.2.11
1杨氏矩阵
int find_num(int arr[][3], int row, int col, int k)
{
int x = 0;
int y = col - 1;
while (x<row && y>=0) // 防止越界
{
if (arr[x][y] < k)
x++;
else if (arr[x][y] > k)
y--;
else
return 1;
}
return 0; //没找到返回0
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 7;
int ret = find_num(arr, 3, 3, k);
if (ret == 1)
printf("找到了!");
else
printf("没找到..");
return 0;
}
现在要求返回下标,可以这样写
int find_num(int arr[][3], int* row, int* col, int k)
{
int x = 0;
int y = *col - 1;
while (x<row && y>=0) // 防止越界
{
if (arr[x][y] < k)
x++;
else if (arr[x][y] > k)
y--;
else
{
*row = x;
*col = y;
return 1;
}
}
return 0; //没找到返回0
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 7;
int x = 3;
int y = 3;
int ret = find_num(arr, &x, &y, k);
if (ret == 1)
{
printf("找到了!\n");
printf("下标是:%d %d\n", x, y);
}
else
printf("没找到..");
return 0;
}
字符串左旋
方法1,直接循环
void left_move(char arr[], int k)
{
int n = strlen(arr);
for (int i = 0; i < k; i++)
{
char tmp = *arr; //先把首字母存起来
// 接着让后面n-1挪到前面来
for (int j = 0; j < n - 1; j++)
{
*(arr + j) = *(arr + j + 1);
}
// 最后把存起来的tmp放到最后
*(arr + n - 1) = tmp;;
}
}
int main()
{
char arr[] = "ABCDEF";
int k = 2;
left_move(arr, k);
printf("%s\n", arr);
}
方法2,三步翻转法
void reverse(char* left,char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "ABCDEF";
int k = 2;
int n = strlen(arr);
reverse(arr, arr + k - 1); // 左
reverse(arr + k, arr + n - 1); //右
reverse(arr, arr + n - 1); // 整体翻转
printf("%s\n", arr);
}
字符串旋转结果
方法1,直接穷举
int is_rotate(char* arr1, char* arr2)
{
int n = strlen(arr1);
for (int i = 0; i < n; i++)
{
char tmp = *arr1; //先把首字母存起来
// 接着让后面n-1挪到前面来
for (int j = 0; j < n - 1; j++)
{
*(arr1 + j) = *(arr1 + j + 1);
}
// 最后把存起来的tmp放到最后
*(arr1 + n - 1) = tmp;
if (strcmp(arr1, arr2) == 0)
return 1;
}
return 0;
}
int main()
{
char arr1[] = "AABCD";
char arr2[] = "BCDAA";
int n = strlen(arr1);
int ret = is_rotate(arr1, arr2);
if (ret == 1)
printf("yes!\n");
else
printf("no...\n");
}
方法二,用库函数
int is_left_rotate(char* arr1, char* arr2)
{
if (strlen(arr1) != strlen(arr2)) // 如果两个字符串大小不同,必然不会是另一个字符串翻转过来的
return 0;
// 先在arr1[]后复制一份自己
int len = strlen(arr1);
arr1 = strncat(arr1, arr1, len);
// 接着看arr2是否是arr1的子集
char* pret = strstr(arr1, arr2);
return pret != NULL; // 如果pret是NULL,则返回假0;
}
int main()
{
char arr1[20] = "AABCD";
char arr2[] = "BCDAA";
int ret = is_left_rotate(arr1, arr2);
if (ret == 0)
printf("no...\n");
else
printf("yes!\n");
return 0;
}