| |
|
开发:
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。
结果如下:
结果如下: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |