c语言数组训练之多字符从两端向中间汇聚+找出数组中的“单身狗”(只出现过一次的字符)

一.多字符从两端向中间汇聚

首先,我们要把他们向中间汇聚的过程显现出来,就是每个字符汇聚时打印一次。这里我们可以设两个数组,在第一个数组里面是我们最后要打印的数组,第二个数组可以初始化全部为一些符号比如“**********”这类。然后不断替换。将第一个数组的内容从两端一个个的替换。所以,代码就出来了。

然后,为了更好的观察过程,我们这里会用到一库函数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;
}

这个练习有这两种实现代码。

依祝:“码”思泉涌,下“指”如有神。

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值