一.多字符从两端向中间汇聚
首先,我们要把他们向中间汇聚的过程显现出来,就是每个字符汇聚时打印一次。这里我们可以设两个数组,在第一个数组里面是我们最后要打印的数组,第二个数组可以初始化全部为一些符号比如“**********”这类。然后不断替换。将第一个数组的内容从两端一个个的替换。所以,代码就出来了。
然后,为了更好的观察过程,我们这里会用到一库函数Sleep(),里面是以毫秒为单位,这样的话,可以让编译过程在每一次替换后停一段时间。其对应的头文件是windows.h。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
char a1[] = "love Jackson Yee";
char a2[] = "****************";
int left = 0, right = strlen(a1)-1;//也可以用sizeof,只不过要减2
while (left <= right)
{
a2[left] = a1[left];
a2[right] = a1[right];
printf("%s\n", a2);
Sleep(1000);
left++;
right--;
}
return 0;
}
这最基本的代码就出来了,但是为了结果更加简洁,我们可以每一次向中间汇聚的过程结束后,清除面板,打印出最终结果。如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
char a1[] = "love Jackson Yee";
char a2[] = "****************";
int left = 0, right = strlen(a1) - 1;//也可以用sizeof,只不过要减2
while (left <= right)
{
a2[left] = a1[left];
a2[right] = a1[right];
printf("%s\n", a2);
Sleep(1000);
system("cls");//清除屏幕上的信息
left++;
right--;
}
printf("%s\n", a2);
return 0;
}
这里,我们用到了system库函数其头文件是stdlib.h,其中cls的作用是清除屏幕。
二.找出数组中只出现过一次的字符“单身狗”
首先,假设有这么一个数组,里面是{1,1,2,2,3,3,4,4,5}若将这几个数按位亦或会怎么样呢?
我们可以知道“相同为0,相异为1”,若成双成对的按位异或最终会得到0,但是再与单身狗按位异或会得到单身狗自己,所以我们这里可以暴力求解,直接用按位异或求出“单身狗”。代码如下:
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,7,1,3,4,2 };
int ret = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
ret ^= arr[i];
}
printf("单身狗是:%d\n", ret);
return 0;
}
当然,这里我们也可以用计数器的方法,计算出现了几次,只出现一次是单身狗。这个方法要用到两个循环。
#include <stdio.h>
int main()
{
int i = 0;
int arr[] = { 1,2,3,4,7,1,3,4,2 };
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
int j = 0;
int count = 0;
for (j = 0; j < sz; j++)
{
if (arr[i] == arr[j])
{
count++;
}
}
if (count == 1)
{
printf("单身狗是:%d\n", arr[i]);
break;//只有一个单身狗,找到就跳出循环
}
}
return 0;
}
这个练习有这两种实现代码。
依祝:“码”思泉涌,下“指”如有神。