![在这里插入图片描述](https://img-blog.csdnimg.cn/a9c886de51994dcab21af6d0357255e1.png#pic_center)
1.字符串的插入
描述:编写算法,实现下面函数的功能。函数void insert(char *s, char *t, int pos)
将字符串t插入到字符串s中,插入位置为pos(插在第pos个字符前)。假设分配给字符串s的空间足够让字符串t插入。
说明:不得使用任何库函数。
输入样例:
1
abcde
abc
2
acd
baaaa
输出样例:
abcabcde
abaaaacd
#include <stdio.h>
#define MAX_SIZE 100
void insert(char *dest, char *src, int pos) {
int len_dest = 0;//length of the destination string
int len_src = 0;//length of the source string
int i, j;
/*get the length of these two strings*/
while (*(dest + len_dest) != 0) {
len_dest++;
}
while (*(src + len_src) != 0) {
len_src++;
}
/*move destination string backward partly*/
for (i = len_dest - 1; i >= pos-1; i--) {
dest[len_src + i] = dest[i];
}
/*insert source string*/
for (j = len_src - 1; j >= 0; j--) {
dest[len_src + i] = src[j];
i--;
}
}
int main() {
int m;
while (scanf("%d", &m) && m != 0) {
char dest[MAX_SIZE], src[MAX_SIZE];
getchar();//receive extra '\n'
scanf("%s", dest);
getchar();
scanf("%s", src);
insert(dest, src, m);
printf("\n%s", dest);
}
return 0;
}
2.二维数组中的元素查重
描述:设二维数组a[1…m, 1…n]含有m*n个整数。编写一个算法判断a中所有元素是否互不相同。
输入样例:
4 3
1 2 3
4 5 6
7 8 9
10 11 12
3 4
1 2 3 4
5 6 7 8
1 9 10 11
0 0
输出样例:
NO
YES
#include <stdio.h>
#include <stdlib.h>
int array_compare(int **array, int m, int n);
int array_compare_(int **array, int m, int n);
int main() {
int m, n;
while (scanf("%d %d", &m, &n) && m != 0 && n != 0) {
/*allocate space*/
int **array = (int **) malloc(sizeof(int *) * m);
for (int i = 0; i < m; i++) {
array[i] = (int *) malloc(sizeof(int) * n);
}
/*input data*/
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &array[i][j]);
}
}
/*judge*/
printf("%s\n", array_compare(array, m, n) ? "YES" : "NO");
/*printf("%s\n", array_compare_(array, m, n) ? "YES" : "NO");*/
/*free heap space*/
for (int i = 0; i < m; i++) {
free(array[i]);
}
free(array);
array = NULL;//avoid wild pointer
}
return 0;
}
int array_compare(int **array, int m, int n) {
/*outer circulation*/
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
/*inner circulation*/
for (int k = 0; k < m; k++) {
for (int l = 0; l < n; l++) {
/*values are equal && not in the same position*/
if (*(*(array + i) + j) == *(*(array + k) + l) && !(i == k && j == l)) {
return 1;
}
}
}
}
}
return 0;
}
int array_compare_(int **array, int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int k, l;
/*从当前元素的下一个元素开始比较*/
if (j < n - 1) {//当前元素不是该行最后一个元素
k = i;
l = j + 1;
} else if (i < m - 1) {//当前元素为本行最后一个元素但该元素不在最后一行
k = i + 1;
l = 0;
} else {//当前元素为二维数组最后一个元素
return 0;
}
/*先与当前行的剩余元素进行比较*/
while (l < n) {
if (array[i][j] == array[k][l++]) {
return 1;
}
}
/*与其余行的元素比较*/
for (k = k + 1; k < m; k++) {
for (l = 0; l < n; l++) {
if (array[i][j] == array[k][l]) {
return 1;
}
}
}
}
}
return 0;
}
3.查找子串第一次出现的位置
描述:在C语言<string.h>
头文件内,实现了函数char *strstr(char *str1, const char *str2)
。它的作用是:若str2是str1的子串,则返回str2在str1中首次出现的地址;如果str2不是str1的子串,则返回NULL。下面,请你设计算法简单实现函数strstr()
,若存在则返回子串首次出现的下标(从0开始),若不存在返回-1。
输入样例:
bjfuacm bjfu
datastructure hello
aaaaaaaaaaab ab
0 0
输出样例:
0
-1
10
#include <stdio.h>
#define MAX_SIZE 100
int strstr(char *m_str, const char *p_str);
int main() {
char str1[MAX_SIZE], str2[MAX_SIZE];
while (scanf("%s", str1) && scanf("%s", str2)) {
if (str1[0] == 48 && str1[1] == 0 && str2[0] == 48 && str2[1] == 0) break;
printf("\n%d", strstr(str1, str2));
}
return 0;
}
int strstr(char *m_str, const char *p_str) {
int is_equal;
int m_cur, p_cur;
for (m_cur = 0; *(m_str + m_cur) != 0; m_cur++) {
is_equal = 1;
p_cur = 0;
int tmp = m_cur;
while (*(p_str + p_cur) != 0) {
if (*(m_str + tmp) == *(p_str + p_cur)) {
tmp ++;
p_cur++;
} else {
is_equal = 0;
break;
}
}
if (is_equal == 1) {
return m_cur;
}
}
return -1;
}