文章目录
- 前言
- 一、左旋字符串
- 1. 左旋字符串1
- 2. 左旋字符串2
- 二、杨氏矩阵
- 1. 结构体返回数字在杨氏矩阵中的位置
- 2. 行列数字的地址返回数字在杨氏矩阵中的位置
- 三、一个字符串左旋能否得到另一个字符串
- 1. 一个一个左旋并判断
- 2. 使用库函数
- 四、判断有序数列
- 总结
前言
C语言实现左旋字符串、左旋字符串找子串、杨氏矩阵找数字等介绍
一、左旋字符串
- 将一个给定的字符串,按照给定的数字进行左旋
- 如: abcdef 左旋 1 个字符 得到 bcdefa
- 如:abcdef 左旋 2 个字符 得到 cdefab
1. 左旋字符串1
- 每次左旋一个字符,循环k次,达到效果。
- k 要 % len 保证只在字符串长度中循环。
#include <stdio.h>
#include <string.h>
// 左旋字符串
void str_rotate(char arr[], int k)
{
int len = strlen(arr);
k %= len;
while (k--)
{
char tmp = arr[0];
int i = 0;
for (i = 0; i < len - 1; i++)
{
arr[i] = arr[i + 1];
}
arr[len - 1] = tmp;
}
}
int main()
{
// 字符串必须可以改变,所以用数组
char arr[] = "abcdef";
// 定义要旋转几个字符串
int k = 0;
scanf("%d", &k);
str_rotate(arr, k);
printf("%s\n", arr);
return 0;
}
2. 左旋字符串2
- 反转 起始地址 到 k 的地址
- 再反转 k 的地址 到 数组结束地址
- 最后反转整个数组
- k 要 % len 保证只在字符串长度中循环。
#include <stdio.h>
#include <string.h>
//左旋字符串
// 反转函数
void reverse(char* start, char* end)
{
while (start < end)
{
char tmp = *start;
*start = *end;
*end = tmp;
start++;
end--;
}
}
// 调用左旋函数 反抓三次
void str_rotate(char arr[], int k)
{
int len = strlen(arr);
k %= len;
reverse(arr, arr + k - 1);
reverse(arr + k, arr + len - 1);
reverse(arr, arr + len - 1);
}
int main()
{
//字符串必须可以改变,所以用数组
char arr[] = "abcdef";
//定义要旋转几个字符串
int k = 0;
scanf("%d", &k);
str_rotate(arr, k);
printf("%s\n", arr);
return 0;
}
二、杨氏矩阵
- 杨氏矩阵的特点:
- 每行 从左向右 递增
- 每列 从上到下 递增
1. 结构体返回数字在杨氏矩阵中的位置
#include <stdio.h>
struct Point
{
int x;
int y;
};
struct Point fine_num(int arr[3][3], int row, int col, int k)
{
int x = 0;
int y = col - 1;
struct Point p = { -1 , -1 };
while (x < row && y >= 0)
{
if (k < arr[x][y])
{
y--;
}
else if (k > arr[x][y])
{
x++;
}
else if (k == arr[x][y])
{
p.x = x;
p.y = y;
return p;
}
}
return p;
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 0;
scanf("%d", &k);
struct Point ret = fine_num(arr, 3, 3, k);
printf("%d %d", ret.x, ret.y);
return 0;
}
2. 行列数字的地址返回数字在杨氏矩阵中的位置
#include <stdio.h>
int fine_num(int arr[3][3], int* row, int* col, int k)
{
int x = 0;
int y = *col - 1;
while (x < *row && y >= 0)
{
if (k < arr[x][y])
{
y--;
}
else if (k > arr[x][y])
{
x++;
}
else if (k == arr[x][y])
{
*row = x;
*col = y;
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 0;
scanf("%d", &k);
int x = 3;
int y = 3;
int ret = fine_num(arr, &x, &y, k);
if (ret)
printf("%d %d\n", x, y);
else
printf("没找到\n");
return 0;
}
三、一个字符串左旋能否得到另一个字符串
1. 一个一个左旋并判断
#include <stdio.h>
#include <string.h>
int is_left_rotate(char arr1[], char arr2[])
{
int i = 0;
int len = strlen(arr1);
for (i = 0; i < len; i++)
{
char tmp = arr1[0];
int j = 0;
for (j = 0; j < len - 1; j++)
{
arr1[j] = arr1[j + 1];
}
arr1[len - 1] = tmp;
if (strcmp(arr1, arr2) == 0)
{
return 1;
}
}
return 0;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "cdefab"; // 找到了
//char arr2[] = "defabc"; // 找到了
//char arr2[] = "efabcd"; // 找到了
//char arr2[] = "fabcde"; // 找到了
int ret = is_left_rotate(arr1, arr2);
if (ret)
printf("找到了\n");
else
printf("没找到\n");
return 0;
}
2. 使用库函数
- 先进行 字符串追加
- 在追加后的字符串找与目标字符串相同的子串
- 同时保证 两个字符串数量相等
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "cdef"; // 找到了
//char arr2[] = "defabc"; // 找到了
//char arr2[] = "efabcd"; // 找到了
//char arr2[] = "fabcde"; // 找到了
int len1 = strlen(arr1);
int len2 = strlen(arr2);
if (len1 != len2)
printf("没找到\n");
else
{
strncat(arr1, arr1, len1);
char* ret = strstr(arr1, arr2);
if (ret == NULL)
printf("没找到\n");
else
printf("找到了\n");
}
return 0;
}
四、判断有序数列
- 升序或者降序 都是有序
- 相等也是有序
- 其他无序
#include <stdio.h>
int main() {
int n = 0;
scanf("%d", &n);
int arr[50] = { 0 };
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n-1; i++)
{
if (arr[0] < arr[1])
{
if (arr[i] > arr[i + 1])
{
break;
}
}
else if(arr[0] > arr[1])
{
if (arr[i] < arr[i + 1])
{
break;
}
}
else if (arr[0] = arr[1])
{
if (arr[i] != arr[i + 1])
{
break;
}
}
}
if (i == n - 1)
printf("sorted\n");
else
printf("unsorted\n");
return 0;
}
总结
C语言实现左旋字符串、左旋字符串找子串、杨氏矩阵找数字、判断有序数列等介绍