一道百度之星编程大赛题的随笔联想·(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();

运行效果如下所示:

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




目录
相关文章
|
4月前
|
Python
告别死记硬背:掌握Python正则表达式re模块的高效应用&[面向百度编程]
Python中正则表达式的高效应用,通过内置的`re`模块,讲解了如何匹配、提取和替换字符串,并提供了相关示例代码,同时提倡通过实践来掌握正则表达式的使用,而不是仅仅依赖网络搜索。
48 1
|
前端开发 JavaScript Java
阿里、腾讯、百度大厂的程序员编程指南规范
整理了几个大厂的编程规范,语言包含:**Javascript、Css、Java、C#**,这些文档不仅是初学者有必要看,有经验的程序员也是可以学习的,编程规范不仅是规则,更是可以从大厂的规范中学习到很多知识,比如大厂为什么这么订规范、他们是考虑原则是什么,带着类似问题的思考,都有非常有利于我们提高编程能力的。
1800 0
阿里、腾讯、百度大厂的程序员编程指南规范
|
人工智能 BI Windows
2021 年百度之星·程序设计大赛 - 初赛一、二
2021 年百度之星·程序设计大赛 - 初赛一、二
190 0
2021 年百度之星·程序设计大赛 - 初赛一、二
|
Java
2017"百度之星"程序设计大赛 - 复赛1001&&HDU 6144 Arithmetic of Bomb【java大模拟】
Arithmetic of Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 129    Accepted Submission(s): 94 Problem Description 众所周知,度度熊非常喜欢数字。
1429 0
|
Java Go
2017"百度之星"程序设计大赛 - 复赛1003&&HDU 6146 Pok&#233;mon GO【数学,递推,dp】
Pokémon GO Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 171    Accepted Submission(s): 104 Problem Description 众所周知,度度熊最近沉迷于 Pokémon GO。
1431 0
|
Java
2017"百度之星"程序设计大赛 - 复赛1005&&HDU 6148 Valley Numer【数位dp】
Valley Numer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 311    Accepted Submission(s): 165 Problem Description 众所周知,度度熊非常喜欢数字。
1461 0
|
机器学习/深度学习 人工智能 Java
2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】
度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 哗啦啦村袭击了喵哈哈村! 度度熊为了拯救喵哈哈村,带着自己的伙伴去救援喵哈哈村去了!度度熊与伙伴们很快的就过来占据了喵哈哈村的各个军事要地,牢牢的守住了喵哈哈村。
1627 0
下一篇
无影云桌面