1.字符串左旋
实现一个函数,可以左旋字符串中的k个字符
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
第一种解法:将最前面的字符一个一个的拿到后面。
#include<stdio.h>
#include<string.h>
void left_move(char a[], int k)
{
int len = strlen(a);
int j = 0;
for (j = 0; j < k; j++)
{
char tmp = a[0];//如果不加这一句,后续运行a[0]就会变化
for (int i = 0; i < len; i++)
{
a[i] = a[i + 1];
}
a[len - 1] = tmp;
}
}
int main()
{
char arr[] = "abcdef";
int k = 0;//记录要左旋转字符的个数
scanf("%d", &k);
left_move(arr, k);
printf("%s", arr);
return 0;
}
cdef第二种方法:将字符逆序。比如要左旋两个字符,abcdef 先分别逆序ab和 cdef,即bafedc。然后再逆序整个字符串,变成cdefab。
#include<stdio.h>
#include<string.h>
void reverse(char* left, char* right)
{
while (left < right)
{
int t = *left;
*left = *right;
*right = t;
left++;
right--;
}
}
void left_move(char arr[], int k)
{
int len = strlen(arr);
//先逆序前k个字符
reverse(arr, arr + k - 1);
//再逆序后len-k个字符
reverse(arr + k, arr + len - 1);
//最后逆序整个字符串
reverse(arr, arr + len - 1);
}
int main()
{
char arr[] = "abcdef";
int k = 0;
scanf("%d", &k);
left_move(arr, k);
printf("%s", arr);
return 0;
}
2.杨氏矩阵
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N)。
int find_k(int arr[3][3], int k, int r, int c)
{
int x = 0;
int y = c - 1;
int flag = 0;
while (x < r && y >= 0)
{
if ( arr[x][y] < k)
{
x++;
}
else if (arr[x][y] > k)
{
y--;
}
else
{
printf("找到了,下标为:%d %d", x, y);
flag = 1;
break;
}
}
if (flag == 0)
printf("找不到!");
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int k = 0;//需要找的数
scanf("%d", &k);
find_k(arr, k,3,3);//注意 需要设置行列数
return 0;
}
为了提高代码的独立性。(高内聚,低耦合)
代码优化:
int find_k(int arr[3][3], int k, int* px, int* py)
{
int x = 0;
int y = *py - 1;
int flag = 0;
while (x < *px && y >= 0)
{
if (arr[x][y] < k)
{
x++;
}
else if (arr[x][y] > k)
{
y--;
}
else
{
*px = x;
*py = y;
return;
}
}
}
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;
find_k(arr, k, &x, &y);//注意 需要设置行列数
if (x == -1 && y == -1)
{
printf("找不到!");
}
else
{
printf("找到了,下标是:%d %d\n", x, y);
}
return 0;
}
3.有序序列合并
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入包含三行,
第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。
输出描述:
输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
int main()
{
int n = 0;
int m = 0;
scanf("%d%d", &n, &m);
int arr1[n];//C99
int arr2[m];
//接收第1个序列
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
}
//接收第2个序列
for (i = 0; i < m; i++)
{
scanf("%d", &arr2[i]);
}
//有序合并打印
i = 0;//遍历序列1
j = 0;//遍历序列2
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
printf("%d ", arr1[i]);
i++;
}
else
{
printf("%d ", arr2[j]);
j++;
}
}
if (i == n)
{
for (; j < m; j++)
{
printf("%d ", arr2[j]);
}
}
else
{
for (; i < n; i++)
{
printf("%d ", arr1[i]);
}
}
return 0;
}
4.空心三角形
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的“空心”三角形图案。
输入描述:
多组输入,一个整数(3~20),表示输出的行数,也表示组成三角形边的“*”的数量。
输出描述:
针对每行输入,输出用“*”组成的“空心”三角形,每个“*”后面有一个空格。
#include<stdio.h>
int main()
{
int n = 0;
int i = 0;
int j = 0;
while (scanf("%d", &n) == 1)
{
for (i = 0; i < n; i++)
{
for (j = 0; j <= i; j++)
{
if (j == 0 || i == n - 1 || i == j)
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}
4.序列中删除指定的数字
描述
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
数据范围:序列长度和序列中的值都满足 1 \le n \le 501≤n≤50
输入描述:
第一行输入一个整数(0≤N≤50)。
第二行输入N个整数,输入用空格分隔的N个整数。
第三行输入想要进行删除的一个整数。
输出描述:
输出为一行,删除指定数字之后的序列。
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int a[50] = { 0 };
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
int del = 0;
scanf("%d", &del);
int j = 0;
for (i = 0; i < n; i++)
{
if (a[i] != del)
{
a[j++] = a[i];
}
}
for (i = 0; i < j; i++)
{
printf("%d", a[i]);
}
return 0;
}
5.X形图案
描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。
输入描述:
多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。
输出描述:
针对每行输入,输出用“*”组成的X形图案。
#include<stdio.h>
int main()
{
int n = 0;
int i = 0;
int j = 0;
while (scanf("%d", &n) != EOF)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i == j || i + j == n - 1)
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
return 0;
}