3 如何进行程序设计才能最有效地解决复杂编程问题

0 引言

大概是从项目结题之后开始刷题的。自己的目标也很明确,一定要去民企,最好是互联网公司。但是刷了一些题目之后,发现自己虽然能解决一些问题,但是有时候脑子会卡壳,无法从全局上把握问题。思考之后感觉是自己程序设计以及系统性思维的能力还没有上来,因此写个帖子总结一下,此贴会不断更新。以下是本人对“如何进行程序设计才能最有效地解决复杂编程问题”的一点思考。我把解决这个问题分成了四个步骤,在分析的同时会举出具体的例子帮助大家理解。

1 抽象问题具体化

举例:【反转链表问题】定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表结点定义如下:
struct ListNode
{
  int  m_nKey;
  ListNode*  m_pNext;
}

面对一个编程问题,我们通常都要采用“抽象问题具体化”的方法使自己更好地理解问题。原因当然很简单,具体的情景是局部的,包含的信息量少,所以大脑接受起来比较容易;而抽象问题往往从多个具体情景中抽象而来,包含的信息量大,大脑理解起来很困难。举个例子,国标字字珠玑,虽然字数很少,但是看起来很是费劲,需要借助他人或者工具书的帮助才能够理解。  我们在面对复杂编程问题时,也要借鉴这种思路。下面开始对问题进行分析。

举例1:输入一个链表,"head->2->3->7->8->NULL",把链表反转之后是"reverseHead->8->7->3->2->NULL",最后返回一个reverseHead即可;

举例2:输入一个空链表,什么操作也不做,返回原来的头结点即可,reverseHead = head,返回即可;

举例3:输入一个只有一个结点的链表,"head->2->NULL",把链表反转之后是 "reverseHead->2->NULL",最后返回一个reverseHead即可;

举例4:输入一个只有两个结点的链表,"head->2->3->NULL",把链表反转之后是"reverseHead->3->2->NULL",最后返回一个reverseHead即可。

2 具体问题抽象化

(1)对具体的例子进行抽象分析

从1中的四个例子可以作出如下分析。

1)问题的输入是什么。“一个链表的头结点”,表明该函数需要传入的参数为一个头结点,类似于  ListNode* head 这种。

2)问题的输出是什么。“反转后链表的头结点”,表明该函数需要return一个头结点,类似于 ListNode* reverseHead 这种。

3)具体的问题是什么。“反转链表”,表明该函数需要进行的操作是将当前结点的指针指向前一个结点。其中包含例外情况,将在下面的demo中具体讨论。

(2)测试用例

设函数的接口为 ListNode* ReverseList(ListNode* head);

测试用例应当分为几类。根据(1)3),应当分为以下几类。

1)空链表,直接什么都不做,返回head即可。

/* head = NULL*/

ListNode* head = NULL;

ListNode* reverseNode = ReverseList(head) ;

2)一个结点,直接什么都不做,返回head即可。

/** head -> 1 -> NULL*/ListNode* head = NULL;    // 存疑
ListNode* pNode1;pNode1->m_mKey = 1;
pNode1->m_pNext = NULL;head = pNode1;
ListNode* reverseNode = ReverseList(head) ;

3)两个及两个以上结点,需要遍历结点,遍历一遍即可。

/** head -> 1 -> 2 -> NULL*/

ListNode* head = NULL;    // 存疑ListNode* pNode1,pNode2;pNode1->m_mKey = 1, pNode2->m_nKey = 2;pNode1->m_pNext = pNode2, pNode2->m_pNext = NULL;head = pNode1;ListNode* reverseNode = ReverseList(head) ;

3 开始demo

ListNode* ReverseList(ListNode* head){

}

4 写完代码,用2中的测试用例进行测试,保证测试用例全部通过

5 排版

原文地址:https://www.cnblogs.com/ghjnwk/p/9974746.html

时间: 2024-08-11 05:49:06

3 如何进行程序设计才能最有效地解决复杂编程问题的相关文章

web网站css,js更新后客户浏览器缓存问题,需要刷新才能正常展示的解决办法

问题描述 最近将公司官网样式进行了调整,部署到服务器后访问发现页面展示不正常,但是刷新之后就会展示正常. 问题分析 研究之后发现可能的原因有 css文件过大,加载缓慢 本地缓存问题,虽然服务器修改了css文件,但是浏览器仍然使用本地缓存的css, 需要用户多刷新一次才能正常展示显然是很不合理的,那么怎么样解决更新后让浏览器请求新的css或js文件呢? 解决办法 方法1 更新文件后更改css/js文件名. 其实解决这个问题很简单,缓存是通过文件名标记缓存的内容的.在你更新了网站的css文件内容后,

【转载】web网站css,js更新后客户浏览器缓存问题,需要刷新才能正常展示的解决办法

原文:http://blog.csdn.net/csdn100861/article/details/50684438 问题描述 部署到服务器后访问发现页面展示不正常,但是刷新之后就会展示正常. 问题分析 可能的原因有 css文件过大,加载缓慢 本地缓存问题,虽然服务器修改了css文件,但是浏览器仍然使用本地缓存的css, 需要用户多刷新一次才能正常展示显然是很不合理的,那么怎么样解决更新后让浏览器请求新的css或js文件呢? 解决办法 方法1 更新文件后更改css/js文件名. 其实解决这个问

程序设计入门——C语言 第7周编程练习 1多项式加法(5分)

第7周编程练习 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 1 多项式加法(5分) 题目内容: 一个多项式可以表达为x的各次幂与系数乘积的和,比如: 2x6+3x5+12x3+6x+20 现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出. 程序要处理的幂最大为100. 输入格式:

程序设计入门——C语言 第7周编程练习 2 鞍点(5分)(5分)

2 鞍点(5分) 题目内容: 给定一个n*n矩阵A.矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第i行上的最大数,第j列上的最小数.一个矩阵A也可能没有鞍点. 你的任务是找出A的鞍点. 输入格式: 输入的第1行是一个正整数n, (1<=n<=100),然后有n行,每一行有n个整数,同一行上两个整数之间有一个或多个空格. 输出格式: 对输入的矩阵,如果找到鞍点,就输出其下标.下标为两个数字,第一个数字是行号,第二个数字是列号,均从0开始计数. 如果找不到,就输出 NO 题目所给的数据保证

程序设计入门——C语言 第6周编程练习 1 分解质因数(5分)

1 分解质因数(5分) 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x3. 现在,你的程序要读入一个[2,100000]范围内的整数,然后输出它的质因数分解式:当读到的就是素数时,输出它本身. 提示:可以用一个函数来判断某数是否是素数. 输入格式: 一个整数,范围在[2,100000]内. 输出格式: 形如: n=axbxcxd 或 n=n 所有的符号之间都没有空格,x是小

程序设计入门——C语言 第6周编程练习 2 完数(5分)

2 完数(5分) 题目内容: 一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). 现在,你要写一个程序,读入两个正整数n和m(1<=n<m<1000),输出[n,m]范围内所有的完数. 提示:可以写一个函数来判断某个数是否是完数. 输入格式: 两个正整数,以空格分隔. 输出格式: 其间所有的完数,以空格分隔,最后一个数字后面没有空格.如果没有,则输出一行文字: NIL (输出NIL三个大写字母

程序设计入门——C语言 第2周编程练习 1时间换算(5分)

1 时间换算(5分) 题目内容: UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8.现在,你的程序要读入一个整数,表示BJT的时和分.整数的个位和十位表示分,百位和千位表示小时.如果小时小于10,则没有千位部分:如果小时是0,则没有百位部分:如果小时不是0而分小于10分,需要保留十位上的0:如果小时是0而分小于10分的,则不需要保留十位上的0.如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分. 有效的输入范围是0到2359,即你的程序不可能从

开机显示Press F1 to Resume,按F1才能进入系统的解决办法

1.开机按DEL键 进入BIOS,选择Standard CMOS Features(标准CMOS功能设置) 2. 把"wait for 'F1' if' error"的项改为 "Disabled" 按F10保存退出. 注:如还会出现,则需换个CMOS电池.

程序设计入门—Java语言 第五周编程题 2井字棋(5分)

2 井字棋(5分) 题目内容: 嗯,就是视频里说的那个井字棋.视频里说了它的基本思路,现在,需要你把它全部实现出来啦. 你的程序先要读入一个整数n,范围是[3,100],这表示井字棋棋盘的边长.比如n=3就表示是一个3x3的棋盘.然后,要读入n行,每行n个数字,每个数字是1或0,依次表示[0,0]到[n-1,n-1]位置上的棋子.1表示X,0表示O(大写字母O). 你的程序要判断其中是否存在某一方获胜,获胜的条件是存在整行或整列或整条对角线或整条反对角线上是相同的棋子.如果存在,则输出代表获胜一