1. 题目来源

麻省理工的编程导论:
Introduction to Computer Science and Programming Using Python
第一周课程的第三个编程题
Week 1: Python Basics Problem Set 1 Problem 3

2. 题目内容

Assume s is a string of lower case characters.
Write a program that prints the longest substring of s in which the letters occur in alphabetical order. For example, if s = 'azcbobobegghakl', then your program should print

Longest substring in alphabetical order is: beggh

In the case of ties, print the first substring. For example, if s = ‘abcbcd’, then your program should print

Longest substring in alphabetical order is: abc

用白话来说,我们现在有个字符串,我们希望得到字符串中按26个字母表顺序的最长字符串子集。
注意哦,aab也是按字母表顺序的。附:

从官网题目介绍的最下角的Note中,它已经温馨的给予提示:如果你花了几个小时都没做出来的话,亲爱的,你还是继续学习后续内容吧。

3. 解题经过

虽然我是一个编程小白,但看完题目,依然迷の自信地觉得,我应该不是大多数那一类。
一个小时过去,程序感觉写的差不多了,运行了一个用例s = 'azcbobobegghakl',没毛病。

  1. 赶紧提交程序,10.5/15分,原来部分用例无法通过,观察后发现,原来题目部分理解错误
  2. 再改,再不通过,原来有细节没考虑
  3. 再改,再不通过
  4. 再改,各种报错


九点,十点,十一点,总感觉再改改应该能改好的,再一看表,已经快十二点了,只好收拾回去,心里却特别的不甘心。

为什么我写的程序总是有各种细节没有考虑完全?
为什么总感觉自己写程序很被动,哪里有错改哪里?

离开公司后拍了一张照片。凌晨的路上,格外地寂静,我满脑子都是问题出现在了哪里

4. 程序是逻辑的实现

今天公司团建,大部分人都出去了。我坐下来开始思考自己的问题出现了哪里。不是程序,而是写程序的过程。

作为一个小白,我一般看完题目要求,便立即去实现,然后遇到问题,就去改问题,直到没有报错为止。

慢慢地我发现,我写程序总是有各种遗漏点,对于复杂的编程,不断纠错的过程花费时间过多。

我决定换一个思路,开始重新编写昨天的程序。

4.1 实现逻辑

首先我用思维导图梳理了我对题目的理解和实现逻辑,这里特别感谢Jane推荐我的百度脑图,真的特别好用。

4.2 根据逻辑编写程序

我边分析逻辑,边写程序,按照逻辑模块,一块一块地去分析实现。
你大可不必去理解每个实现过程,这也不是我的目的,我更多地是想完整地记录下我的程序是怎样一步一步地去实现的。

和之前写程序相比:

  1. 我差不都花了一个半小时,完整地记录和实现了整个程序。
  2. 思路特别清晰,很有逻辑。
  3. 整个过程,心情很愉悦。
1.首先我用一个循环while len(s)> 1,进行切片,直到字符串的长度小于1的时候,我们就不进行切片了
问题:
如果一开始字符串就一个呢
解决:
我们将条件改为len(s)> 0,也就是说为0的时候,我们就结束了
问题:
正常情况下,对字符串进行切片s[start:end],是不可能为0的,至少有个start元素,
除非字符串本身就是空,那也不会进入循环。还有就是当切片长度为1的时候,直接将
下一个切片设为空
2.对s进行遍历
3.设置遍历条件s[i]<=s[i+1]
这里涉及临界点的问题s[i+1]会不会越界,所以我需要对特殊情况进行判断
遍历到最后一个元素也就是i==len(s)-1是不存在s[i+1]的,这个时候:
说明字符串进行不断的切片,已经到了无法切的地步。
这个时候我想分析走到这一步有几种情形:
1)如果是新切片按照顺序走到最后一个元素
2)如果是新切片的第一个元素
我们要添加一个str(存储每一轮遍历切片到进行切片前的字符串子集)
再添加一个str_best(存储满足条件的最优子集)
继续考虑两种情形:
如果是新切片按照顺序走到最后一个元素:
str=s[:i+1]字符串子集
对该子集和已有的最优子集进行比较,所以我还要写一个函数喽,暂且叫is_best_str(str,str_best)
s=''切片设置为空
break结束循环了
如果是新切片的第一个元素:
str=s[:i+1]字符串子集,只包含一个元素
s=''切片设置为空
break结束循环了
所以两种情况代码可以是一样的那我们继续写正常时候的遍历,也就是我们需要对前后字母进行比较
s[i]<=s[i+1]否
如果False,说明后面字母不是按顺序的,那就结束遍历,进行切片吧
str=s[:i+1]
s=[i+1:]
str_best=is_best_str(str,str_best)
break 结束当前遍历
如果True,说明后面一个字母是按顺序的,那就继续遍历:
既然是这样的话我们把判断条件改一下s[i]>s[i+1]
如果True,说明后面字母不是按照顺序的:
str=s[:i+1]
s=[i+1:]
str_best=is_best_str(str,str_best)
否则False,我们继续遍历不做处理那主程序写完了,也不知道有没有bug,写is_best_str(str,str_best)函数吧
这个函数主要是判断当前字符串子集是不是最优子集
最优子集有两个条件:
1.长度最长
2.长度等的话,看不是靠近字符串起始端
第一中情况如果当前字符串比最优字符串长的话,明人不说暗话,快上位吧,这片江山都是你的
if len(str)> len(str_best)str_best = str
第二种情况就是相等了,那我们用字符串的find函数,返回索引位置来判断谁靠前
因为这时候我们要用到原始的字符串s,当是现在的s已经是切片后的了
所以我们事先对s进行复制 s_copy=s
elif len(str)== len(str_best):
如果最优索引的位置大于当前字符串子集,那说明当前的更靠近,快上位if s_copy.find(str_best)> s_copy.find(str):str_best=str
最后我们将结果返回:
return str_bests = 'mfktakscto'
s_copy=s
str=''
str_best=''
"""判断当前字符串子集是不是最优子集"""
def is_best_str(str,str_best):if len(str) > len(str_best):str_best=strelif len(str) == len(str_best):if s_copy.find(str_best)>s_copy.find(str):str_best=strreturn str_bestwhile len(s)> 0 :"""对s进行遍历"""for i in range(len(s)):"""设置遍历条件:后一个字母是不是按顺序""""""如果变量到切片的最后一个元素或者切片只有一个元素时"""if i == len(s)-1:"""存储字符串子集并将新的切片设置为空,程序终于可以结束啦""""""存储该轮字符串子集和设置切片"""str=s[:i+1]s=''"""该轮字符串和最优字符串进行比较,得到当前最优字符串"""str_best = is_best_str(str,str_best)break"""后一个字母不是按照字母表顺序"""elif s[i]>s[i+1]:str=s[:i+1]s=s[i+1:]str_best=is_best_str(str,str_best)break

4.3 完整程序

s_copy=s
str=''
str_best=''
def is_best_str(str,str_best):if len(str) > len(str_best):str_best=strelif len(str) == len(str_best):if s_copy.find(str_best)>s_copy.find(str):str_best=strreturn str_bestwhile len(s)> 0:for i in range(len(s)):if i == len(s)-1:str=s[:i+1]s=''str_best=is_best_str(str,str_best)breakelif s[i]>s[i+1]:str=s[:i+1]s=s[i+1:]str_best=is_best_str(str,str_best)break
print(str_best)

除了修改部分因为标识符出现的语法错误,提交程序后,这次特别顺利地通过了。这一刻,实在是愉悦。

作为一个小白,在编程的路上不断迷茫和徘徊,我之所以去记录自己改善的过程,一方面,如果你和我一样也是小白,希望能让我们一起成长;另一方面,如果你已经度过小白阶段,希望你能同我分享一点编程的心得和建议,让我更快地度过小白阶段。

当然,上述也只是我的摸索过程,如何去写好程序,我也不太了解,如果你有意愿,愿一起探讨交流。

【python编程导论】我想和你探讨下如何去写好程序相关推荐

  1. 计算机编程导论python程序设计答案-学堂在线_计算机科学与Python编程导论_作业课后答案...

    学堂在线_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 近代中国完全沦为半殖民地半封建社会的标志是:A.<马关条约>B.<辛丑条约>C.<凡尔赛和 ...

  2. python交互式程序设计导论答案第五周_学堂在线_计算机科学与Python编程导论_章节测试答案...

    学堂在线_计算机科学与Python编程导论_章节测试答案 更多相关问题 素描的三种表现形式是:(). 运行下列程序:Private Sub form_Click()For i = 1 To 2x = ...

  3. Python 编程导论 Chapter 4 —— 函数、作用域与抽象

    typora-copy-images-to: Risk Management and Financial Institution typora-copy-images-to: Python 编程导论 ...

  4. 计算机编程导论python程序设计答案-学堂云_计算机科学与Python编程导论_作业课后答案...

    学堂云_计算机科学与Python编程导论_作业课后答案 答案: 更多相关问题 保本基金参与股指期货交易,应当根据风险管理的原则,以套期保值为目的.() 基金经理主要依据股票投资价值报告来决定实际的投资 ...

  5. python计算机语言论坛,自学IT吧论坛国外大神-计算机科学及 Python 编程导论-中文字幕编程语言资源天地 - www.zxit8.com...

    ( W4 V& M+ h- m$ X( d! c' s0 h. M0 l; \' A# i+ I1 O- U1 C* G 0 m# M& o1 }4 g! c# X) }$ [% JI ...

  6. 《Python编程实战:运用设计模式、并发和程序库创建高质量程序》—— 第1章 Python的创建型设计模式...

    本节书摘来自华章出版社<Python编程实战:运用设计模式.并发和程序库创建高质量程序>一 书中的第1章,第1.1节,作者:(美) Mark Summerfield,更多章节内容可以访问云 ...

  7. /* * 编程题第五题(20分): 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“

    题目: 编程题第五题(20分): 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 *****************    所谓" ...

  8. PYTHON编程导论群问题汇总(一)

    问题1 [Jane] 课程视频用的是python 2.7并推荐了一个软件 可是书上用的是python 3 所以是安装视频推荐的软件来学习 还是用自己的python 3好呢 Bigjing 推荐pyth ...

  9. python花钱培训值吗-交钱了,学了3天Python编程,我想放弃了......

    交钱了 ,学了3天Python编程,想放弃了,是太难学?是老师教的不好?是学习环境氛围不好?突然发现自己不喜欢?还是自己另有新计划...... 背景 近期,师姐开始刷达内的Python视频,选择学这个 ...

最新文章

  1. android专题-蓝牙扫描、连接、读写
  2. 尾递归及示例(JAVA)
  3. c语言首尾指针相同 则,6.C语言指针练习题.doc
  4. WCF系列学习笔记4之绑定详解
  5. 二维动态数组定义及二维静态数组与**P的区别
  6. mysql sleep 5908_mysql连接卡死,很多线程sleep状态,导致CPU中mysqld占用率极高(问题原因还待考证)...
  7. oracle表违反主键约束,主键/约束/事务/表关系 Oracle
  8. PHP自学--第一天
  9. 云原生势不可挡,华为云GaussDB加速企业数字化转型
  10. php7 xmlreader,PHP扩展之XML操作(四)——XMLReader
  11. 《算法设计与分析基础 第二版》pdf
  12. vscode 搭建Vue项目及引入elementUI
  13. 紫外线杀菌装置:过流式Photoscience紫外线杀菌器
  14. 实验3-5 查询水果价格
  15. 单片机汇编延时程序的理解
  16. HbuildX打包AndroidAPP使用教程
  17. 高等数学 宋浩 笔记一
  18. Apple iPad:过渡设备还是平板电脑?
  19. flink1.13 upsert-kafka connector 实时报表 视频演示
  20. 手动升级11.2.0.3到12.2.0.1

热门文章

  1. MongoDB安装指南
  2. Java学习笔记(二一)——Java 泛型
  3. Scratch等级考试(二级)模拟题
  4. Matlab与线性代数 -- 矩阵的乘法
  5. Meta AI 新研究,统一模态的自监督新里程碑
  6. 机器学习项目模板:ML项目的6个基本步骤
  7. Python数据清理终极指南(2020版)
  8. 与旷视、商汤等上百家企业同台竞技?AI Top 30+案例评选等你来秀!
  9. 网友们票选的2018 Best Paper,你pick谁?
  10. 10行代码爬取全国所有A股/港股/新三板上市公司信息