一道百度之星编程大赛题的随笔联想·(1)

简介:

百度之星,是全球最大的中文搜索引擎,百度公司面向中国高校学生和编程爱好者所举办的高水平的程序设计大赛。他所考试的题目,全部都是算法的题目。

鄙人虽然是一个.net程序员,在工作之余,喜爱算法。 我觉得这个题目有点意思,故而分享给大家,我想到两种方法,提供大家,希望对大家起了一个开阔思路的作用。

首先,看题目是那样的:

请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。

输入数据:一个正整数,以命令行参数的形式提供给程序。

输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出“NONE”。

例如,对于15,其输d出结果是:
1 2 3 4 5
4 5 6
7 8

对于16,其输出结果是:
NONE

我这里提供2种算法的解法,起一个抛砖引玉的作用

方法一:可以从后往前的计算,由大到小的计算。这种计算模式有几个思考的步骤。

①由于使 计算吗,我可以考虑从输入的数字的一半(奇数使其中间数)开始遍历。于是我就有这样一种算法。相应伪代码如图所示:

相应的源代码如下:


1        Console.WriteLine("请你输入一个数字");
 2             int mI = int.Parse(Console.ReadLine());
 3             int temp = mI;
 4            //是否能够拆成n个连续的数字的表计量
 5             bool find = false;
 6             int temp1 = 0;
 7             //记录最终的结果
 8             List<string> strs = new List<string>();                                           
 9                //凭借成最终的字符串
10              string tempstr = string.Empty;
11              //进行循环拆解
12             for (int i = (mI - 1) / 2 + 1; i >= 1; i--)
13             {
14                 //这一元素做差了
15                 temp = temp - i;    
16                 temp1 = temp;
17                 tempstr = tempstr + i.ToString()+",";
18                    //等于了有进一步做数据重置的操作
19                   if (temp == 0)
20             {
21                 tempstr = tempstr.Remove(tempstr.Length - 1);
22                 strs.Add(tempstr);
23                 find = true;
24                 tempstr = string.Empty;
25                 temp = mI;
26                 break;
27             }
28        
29              }
30             //没找到可能就是空啊
31             if (!find)
32             {
33                 Console.WriteLine("None");
34             }
35             else
36             {
37                 //进行了循环遍历打印最终的结果
38                 foreach (var temps in strs)
39                 {
40                     Console.Write(mI.ToString() +
41                         "=");
42                     Console.Write(temps.Replace(",", "+"));
43                     Console.WriteLine();
44                 }
45             }
46             Console.ReadKey();

这种循环的算法固然很好,但是出现漏值的情况。譬如说

15=1+2+3+4+5

 15=4+5+6

  15=&+7

这里遗漏了15=1+2+3+4+5,我这个算法这么做固然很好啊,因为他的时间复杂度是O(n).但,我要明白这么一点的话他是以此循环,同样的数字不可能遍历2次。因此解决这个方案。必须需要两层循环。因此,必须进行方法的重构。伪代码如下:

 

相应源代码如下:


 1 Console.WriteLine("请你输入一个数字");
 2             int mI = int.Parse(Console.ReadLine());
 3             int temp = mI;
 4             bool find = false;
 5             int temp1 = 0;
 6             List<string> strs = new List<string>();
 7 
 8 
 9             string tempstr = string.Empty;
10 
11             for (int i = (mI - 1) / 2 + 1; i >= 1; i--)
12             {
13                 temp = temp - i;
14                 temp1 = temp;
15                 tempstr = tempstr + i.ToString() + ",";
16 
17                 for (int j = i - 1; j >= 1; j--)
18                 {
19                     temp = temp - j;
20                     tempstr = tempstr + j.ToString() + ",";
21                     //小于0
22                     if (temp == 0)
23                     {
24                         tempstr = tempstr.Remove(tempstr.Length - 1);
25                         strs.Add(tempstr);
26                         find = true;
27                         tempstr = string.Empty;
28                         temp = mI;
29                         break;
30                     }
31 
32                     if (temp < 0)
33                     {
34                         tempstr = string.Empty;
35                         temp = mI;
36                         break;
37                     }
38                     //j==1  清空循环
39                     if (j == 1)
40                     {
41                         tempstr = string.Empty;
42                         temp = mI;
43                     }
44 
45                 }
46 
47 
48 
49             }
50 
51             if (!find)
52             {
53                 Console.WriteLine("None");
54             }
55             else
56             {
57                 foreach (var temps in strs)
58                 {
59                     Console.Write(mI.ToString() +
60                         "=");
61                     Console.Write(temps.Replace(",", "+"));
62                     Console.WriteLine();
63                 }
64             }
65             Console.ReadKey();

运行效果如下所示:

这道题有效的考察了循环的知识及简单算法的题目,对初学者学习算法很有好处。




目录
相关文章
|
7月前
|
程序员 测试技术 数据安全/隐私保护
客达天下项目案例
客达天下项目案例
|
运维 Cloud Native 知识图谱
2022藏经阁年度电子书榜单出炉!技术干货实战精华一手掌握!
阿里云开发者社区藏经阁,汇聚阿里工程师精华实战,累计上线400余本电子书,近8000份技术资料。上架至今,已有近200万次下载,1000万次阅读,20万人评论。点击直达https://developer.aliyun.com/ebook/
3571 3
2022藏经阁年度电子书榜单出炉!技术干货实战精华一手掌握!
|
人工智能 程序员 Linux
【猿如意】CSDN推出的程序猿开发百宝箱
【猿如意】CSDN推出的程序猿开发百宝箱
237 0
|
小程序 搜索推荐 Java
程序员推荐的良心网站合集!(第二期)
程序员推荐的良心网站合集!(第二期)
262 0
程序员推荐的良心网站合集!(第二期)
|
机器学习/深度学习 人工智能 监控
DayDayUp:7月25日,如何打造技术品牌影响力?顶级大咖独家传授—阿里云乘风者计划专家博主&CSDN TOP1“一个处女座程序猿”《我是如何通过写作成为百万粉丝博主的?》演讲全文回顾
DayDayUp:7月25日,如何打造技术品牌影响力?顶级大咖独家传授—阿里云乘风者计划专家博主&CSDN TOP1“一个处女座程序猿”《我是如何通过写作成为百万粉丝博主的?》演讲全文回顾 目录 个人简介 一、什么内容是受欢迎的写作内容? 1.1、学生(计算机相关)群体 1.2、同行(开发者)群体 1.3、好内容的特点 二、一些经典的技术文章逻辑框架设计 2.1、从写作逻辑和结构角度考虑 (1)、对于bug类型的文章——通过分析刨根问底 (2)、对于学习类型的文章—通过案例学以致用 (3)、对于总结类型的文章—通过思考产生共鸣 2.2、从写作技巧考虑 (1)、题目和摘要必须简单、清晰明了且定位
DayDayUp:7月25日,如何打造技术品牌影响力?顶级大咖独家传授—阿里云乘风者计划专家博主&CSDN TOP1“一个处女座程序猿”《我是如何通过写作成为百万粉丝博主的?》演讲全文回顾
|
人工智能 BI Windows
2021 年百度之星·程序设计大赛 - 初赛一、二
2021 年百度之星·程序设计大赛 - 初赛一、二
204 0
2021 年百度之星·程序设计大赛 - 初赛一、二
|
Web App开发 SQL 搜索推荐
知网“哭穷”:赔不起 1200 亿;微信公众号文章留言显示 IP 属地;程序员延寿指南霸榜 GitHub;联想高层大降薪|架构周报
本周架构视点:知网“哭穷”:赔不起 1200 亿;微信公众号文章留言显示 IP 属地;程序员延寿指南霸榜 GitHub;联想高层大规模降薪;网易云音乐起诉腾讯音乐;GitHub 弃用 io;ARM 安谋中国 430 多名员工联名签署公开信,反对软银夺权;Firefox:我们不会卖给亿万富翁
176 0
知网“哭穷”:赔不起 1200 亿;微信公众号文章留言显示 IP 属地;程序员延寿指南霸榜 GitHub;联想高层大降薪|架构周报
|
Web App开发 存储 缓存
身家过亿的帝都王子来到1024盛宴-小码农献上linux进阶知识点一篇
身家过亿的帝都王子来到1024盛宴-小码农献上linux进阶知识点一篇
139 0
身家过亿的帝都王子来到1024盛宴-小码农献上linux进阶知识点一篇
|
安全 大数据 程序员
聚能聊每周精选 第十四期
1.数据安全话题其实已经是老生常谈,随着大数据时代的到来,数据和敏感信息问题越来越多,同时也越来越被个人、企业乃至国家所重视。2.程序员的工作和日常生活非常的枯燥,但强烈的好奇心和学习精神是一个程序员的秘密武器,它是程序员们永攀高峰的源泉和动力所在。
3196 0
聚能聊每周精选 第十四期
|
Java 程序员 Spring
聚能聊每周精选 第十五期
Hello! 各位社区小伙伴们!好久不见!“爱你就像,蓝天白云,晴空万里,突然暴风雨。”接下来,让我们一起回顾一下,本周都有哪些热议的话题?各位聊主与粉丝们又有哪些精彩的互动?他们之间又碰撞出了怎样的火花? .
3346 0
聚能聊每周精选 第十五期