题目一:字符串替换函数"i am a student"1个’ 空格 ’替换成2个“#”字符数组大小字符串大小(时间复杂度优化为O(n))
解题思路:
一、先统计出空格个数
二、当i走到空格位置时 在j的前面放上两个#
题目二:将一个数组前m个数据移动到最后面 (例如13425 --> 42513 m取值2)
解题思路:
1、数组全部数据进行逆转
5 2 4 3 1
2、进行区间逆转
注意:区间需要逆转的次数有以下规律
本题中五个元素 5/2==2,只需逆转2次。
void Reverse(int* arr, int begin, int end)
{
assert(arr != NULL && begin <= end);
int temp; //13425
int n = (end - begin + 1) / 2;
for (int i = 0; i < n; i++, begin++, end--)
{
temp = arr[begin];
arr[begin] = arr[end];
arr[end] = temp;
}
}
void Adjust_Reserve_M(int* arr, int len, int m)
{
assert(arr != NULL);
//1、整体数据逆序
Reverse(arr, 0, len - 1);
//2、区间逆转 0~n-m-1 n-m~n-1
Reverse(arr, 0, len - m - 1);
Reverse(arr, len-m, len - 1);
}
int main()
{
int arr[] = { 1,3,4,2,5 };
int len = sizeof(arr) / sizeof(arr[0]);
Adjust_Reserve_M(arr, len, 2);
for (int i = 0; i < len; i++)
{
printf("%5d", arr[i]);
}
return 0;
}
注意:int n = (end - begin + 1) / 2; n的取值是随着区间的改变而改变的
题目三:连接字符串 (“hello” "world")
解题思路:
一、先确定 i j的位置
void my_strcat(char* aim, char* src)
{
assert(aim != NULL && src != NULL);
int i = strlen(aim), j = 0;// i遍历 aim j遍历src
while (src[j] != '\0')
{
aim[i++] = src[j++];
}
aim[i] = '\0';//一定要在 aim结尾加上\0
}
int main()
{
char arr[100] = "hello";
char brr[] = "world";
my_strcat(arr, brr);
printf("%s", arr);
}
注意:再连接的时候 要注意被链接的数组是否有足够的空间
char arr[100] = "hello"; 必须有足够的空间