IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 0 和 1 C语言 -> 正文阅读

[数据结构与算法]0 和 1 C语言

描述

????????研究01串是一件很好玩的事情,现在有一个长度为n的01串,当一个连续的子串中0和1的个数相同,这个子串就是好的子串,现在请你写代码算出这个长度为n的01串中有多少个好的子串。

输入

输入T (1<=T<=10)组数据,每组第一行输入一个整数n (1<=n<=1000),代表01串的长度,接下来输入一行长度为n的01串。

输出

输出T行,每行一个整数作为答案。

样例输入

2

2

01

4

0101

样例输出

1

4

思路及分析:

? ? ? ? 首先要搞懂题目的说明,什么是01串中的好子串。根据题目定义,比如010101 它的划分应当是这样的:

? ? ? ? 根据这样的划分,最直观的发现是需要判断的长度,就也就是它的结束位置是不一定的,所以需要通过变量来控制每一个需要判断的子串的长度。同时,还需要判断的开始位置。我们用指针来描述判断的开始位置和结束位置。定义两个指针变量*start和*end。如图:

我们需要从下面几个方面来考虑。? ? ? ??

?1,如何获取字符0和1?

????????从上面的动图来看,每动一次*start,就动一次*end,直到*end遇到字符‘\0’就结束。

2,长度如何截断?

????????上面的情况是针对两个长度的子串的情况。根据好子串的定义,我们需要每一次截断的的长度应该为偶数倍,这样是比较合理的,比如0101,第一次截断两个长度,根据上面的动图,就是01,10,01。第二次截断当我们对于4个长度的子串的情况的时候,就是0101。如果每一次循环后截断长度加1,这样如0101,第一次截断长度为2,第二次截断长度为3,就是010,肯定不符合好串的定义。这样截断之后,在返回1中,就可以了。

3,需要循环几次?

? ? ? ? 如果我们去找这个规律,比如01010101:

?????????长度为8的时候,长度为2的需要小循环7次。长度为4的需要小循环5次。长度为6的需要小循环3次。长度为8的需要小循环1次。整个过程,需要大的循环四次,让截断长度从2个变成8个。这样就可以完成全部的情况的判断。当然,你可以多试几个01串。

? ? ? ? 通过上面的分析得知:整个过程需要4个循环语句(1个为题目要求的多组输入)。由内到外分别需要循环如何动,如何截断长度,有几个这样的截断长度的循环,要循环几次不同的截断长度,有几组输入。反过来,以01010101举例,01010101.输入01010101一组输入,需要分成上面图片中的4个不同的长度,其中,长度为2的需要7次循环才能找到全部的2个长度的。在让它判断里面的值,判断完0之后要动一次来判断1。

? ? ? ? 这样的分析是最直观的。实现代码分为指针形式(由本人实现),和数组形式(由本人的一位好友实现@Idyllic930,有改动。),要注意的是实现的方式不是唯一的,可以用for也可以用while。

//指针形式
#include<stdio.h>

int main(void)
{
	int t = 0;
	scanf("%d", &t);
	int n = 0;
	char arr[1000] = { 0 };

	for (int m = 0; m < t; m++)//题目要求的循环输入
	{
		int i = 0;//总的循环的次数
		int j = 1;//start要回退的值
		int k = 1;//end要截断的长度
		scanf("%d", &n);
		scanf("%s", arr);

		int count_zero = 0;//计数0的个数
		int count_one = 0;//计数1的个数
		int count = 0;//计数01中好子串的个数

		char* start = arr;//start的位置
		char* end = arr + k;//end的位置

		while (i < n / 2)//循环次数
		{
			while (*end != '\0')
			{
				while(start <= end && *end != '\0')//判断01串里面的值;
				{
					if (*start == '1')//这个值为1,计数1的变量的值加1;
					{
						count_one++;
					}
					if (*start == '0')//这个值为0,计数0的变量的值加1;
					{
						count_zero++;
					}
					start++;//让start指向下一位
				}
				if (count_zero == count_one)//计数1和计数0是否相等,若相等,计数01中好串的变量加1;
				{
					count++;
				}
				end++;//end指向下一位;
				start -= j;//star退回到他-j位;
				//初始化
				count_zero = 0;
				count_one = 0;
			}
			j += 2;
			i += 1;
			k += 2;
			end = arr + k;
			start = arr;
		}
		printf("%d\n", count);
	}
	return 0;
}

结果如下:

#include<stdio.h>
int main()
{
	int t, i;
	scanf("%d", &t);
	for (i = 0; i < t; i++)
	{
		int j = 0;
		int k = 0;
		int count_one = 0;
		int count_zero = 0;
		int count = 0;

		int len = 0;
		int index = 0;
		char arr[100] = { 0 };

		scanf("%d", &len);
		scanf("%s", arr);

		for (j = 1; j < len;)
		{
			for (k = 0; k < len - 1; k++)
			{
				for (index = k, count_zero = 0, count_one = 0; index < (k + 2 * j); index++)
				{
					if (arr[index] == '1')
					{
						count_one++;
					}	
					else if (arr[index] == '0')
					{
						count_zero++;
					}
				}
				if (index > len)
				{
					break;
				}	
				if (count_one == count_zero)
				{
					count++;
				}
					
			}
			j++;
		}
		printf("%d\n", count);
	}
	return 0;
}

结果如下:

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-03 13:17:15  更:2021-12-03 13:17:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:31:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码