1).杨氏矩阵
题目
在这里如果遍历数组时间复杂度为O(N2)不满足题目要求,故应该用另外的方法。
代码实现
int find_arr(int arr[3][3], int r, int c, int k)
{
int x = 0;
int y = c - 1;
while (x < r && y >= 0)
{
if (arr[x][y] < k)
{
x++;
}
else if (arr[x][y] > k)
{
y--;
}
else
{
printf("第%d行 第%d列 ", x, y + 1);
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 7;
//如果找到返回1,找不到返回0
int ret = find_arr(arr, 3, 3, k);
if (ret == 1)
{
printf("找到了\n");
}
else printf("找不到\n");
return 0;
}
2).字符串左旋
代码实现1
void string_left_rorate(char* str, int k)
{
int i = 0;
int n = strlen(str);
for (i = 0; i < k; i++)
{
//每次左旋一个字符
char tmp = *str;//1
//2.后面的n-1个字符往前挪动
int j = 0;
for (j = 0; j < n - 1; j++)
{
*(str + j) = *(str + j + 1);
}
//3.tmp放在最后
*(str + n - 1) = tmp;
}
}
int main()
{
int k = 0;
scanf("%d", &k);
char arr[10] = "ABCDEF";
string_left_rorate(arr, k);
printf("%s\n", arr);
return 0;
}
代码实现2(三步翻转法)
使用三次逆序函数
void reverse(char* left, char* right)
{
assert(left);
assert(right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void string_left_rorate(char* arr, int k)
{
assert(arr);
int n = strlen(arr);
reverse(arr, arr + k - 1);//左
reverse(arr + k, arr + n - 1);//右
reverse(arr, arr + n - 1);//总
}
int main()
{
int k = 0;
scanf("%d", &k);
char arr[10] = "ABCDEF";
string_left_rorate(arr, k);
printf("%s\n", arr);
return 0;
}
3).字符串旋转结果
代码实现1
int is_string_rorate(char* str1, char* str2)
{
int i = 0;
int n = strlen(str1);
for (i = 0; i < n; i++)
{
//每次左旋一个字符
char tmp = *str1;//1
//2.后面的n-1个字符往前挪动
int j = 0;
for (j = 0; j < n - 1; j++)
{
*(str1+ j) = *(str1 + j + 1);
}
//3.tmp放在最后
*(str1 + n - 1) = tmp;
}
if (strcmp(str1, str2) == 0)
{
return 1;
}
return 0;
}
int main()
{
char arr1[] = "AABCD";
char arr2[] = "BCDAA";
int ret = is_string_rorate(arr1, arr2);
if (ret == 1)
{
printf("yes\n");
}
else printf("no\n");
return 0;
}
代码实现2
例如要求AABCD的左旋,拼接两个AABCD,得到AABCDAABCD,当左旋一个字符的时候从第一个开始读五个字符得到AABCD,左旋两个时从第二个开始读五个自读得到ABCDA…,直到左旋五个字符时读取得到AABCD截止
int is_string_rorate(char* str1, char* str2)
{
//长度不相等肯定不是旋转得到的
if(strlen(str1) != strlen(str2))
{
return 0;
}
//1.str1字符串后面追加一个字符串str1
//AABCDAABCD
int len = strlen(str1);
strncat(str1, str1, len);
//2.判断str2是否为str1的字符串
char* ret = strstr(str1, str2);
if (ret == NULL)
{
return 0;
}
else return 1;
}
int main()
{
char arr1[20] = "AABCD";
char arr2[] = "BCDAA";
int ret = is_string_rorate(arr1, arr2);
if (ret == 1)
{
printf("yes\n");
}
else printf("no\n");
return 0;
}