字符串的左旋和右旋
这里以左旋为例
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
…
假设给ABCD,要求左旋k个字符串
字符串左旋之方法1:暴力旋转法
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "ABCD";
int sz = strlen(arr);
int k = 2;
int i = 0;
for (i = 0; i < k; i++)
{
int j = 0;
char tmp = arr[0];
for (j = 0; j < sz-1; j++)
{
arr[j] = arr[j + 1];
}
arr[sz - 1] = tmp;
}
printf("%s\n", arr);
return 0;
}
字符串左旋之方法二------三步反转法
#include<stdio.h>
#include<assert.h>
#include<string.h>
void swap(char* left,char* right)
{
assert(left != NULL);
assert(right != NULL);
while(left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "ABCD";
int len = strlen(arr);
int k = 2;//左旋两个字符
swap(arr , arr + k-1);
swap(arr+k, arr + len - 1);
swap(arr, arr + len - 1);
printf("%s\n", arr);
return 0;
}
杨氏矩阵
#include<stdio.h>
int main()
{
int arr[][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 5;//查找数字7
int sz = sizeof(arr) / sizeof(arr[0][0]);
int x = 0; //行标
int y = 2; //列标
while (x < (sz / 3) && y >= 0)
{
if (arr[x][y] < k)
x++;
else if (arr[x][y] > k)
y--;
else
{
printf("找到了:行标是%d,列标是%d\n", x, y);
break;
}
}
if (x == 3 || y < 0)
printf("找不到\n");
return 0;
}