indent expected怎么解决_编程|解决复杂问题的三种方法:画图、举例、分解

本文介绍了通过画图、举例和分解复杂问题的三种方法来解决编程问题。以字符串替换和某年日历输出为例,详细阐述了如何运用这些策略,包括从后向前替换空格提高效率,以及将复杂问题分解为多个函数实现。
摘要由CSDN通过智能技术生成

画图、举例子和分解这三种办法能够帮助我们解决复杂的编程问题。

051db6d040029da75bf2d361663f51ea.png

图形能使抽象的问题形象化,如涉及链表、 二叉树等数据结构时, 如果在纸上画几张草图, 数形结合,抽象问题中中隐藏的规律就有可能变得很直观。

一个或两个简单而有代表性的例子能使抽象的问题具体化。很多与算法相关的问题都很抽象,未必一眼就能看出它们的规律。 这个时候我们不妨举几个例子, —步一步模拟运行的过程, 说不定就能发现其中的规律, 从而找到解决问题的窍门。

把复杂问题分解成若干个小问题, 是解决很多复杂问题的有效方法。如果我们遇到的问题很大, 可以尝试先把大问题分解成小问题, 然后再递归地解决这些小问题。 分治法、 动态规划等方法都是应用分解复杂问题的思路。从整体上来说,面向过程和面向对象的设计哲学都有这种分解思维的体现,面向对象:函数分解。面向过程:类与对象分解,在类的内部再分解出成员函数。

1 字符串替换(从简单实例和画图入手)

题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。

在网络编程中,如果URL参数中含有特殊字符,如空格、'#'等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在'%'后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成"%20"。再比如'#'的ASCII码为35,即十六进制的0x23,它在URL中被替换为"%23"。

看到这个题目,我们首先应该想到的是原来一个空格字符,替换之后变成'%'、'2'和'0'这3个字符,因此字符串会变长。如果是在原来的字符串上做替换,那么就有可能覆盖修改在该字符串后面的内存。如果是创建新的字符串并在新的字符串上做替换,那么我们可以自己分配足够多的内存。

现在我们考虑怎么做替换操作。最直观的做法是从头到尾扫描字符串,每一次碰到空格字符的时候做替换。由于是把1个字符替换成3个字符,我们必须要把空格后面所有的字符都后移两个字节,否则就有两个字符被覆盖了。

举个例子,我们从头到尾把"We are happy."中的每一个空格替换成"%20"。为了形象起见,我们可以用一个表格来表示字符串,表格中的每个格子表示一个字符。

0b6c611e0f6257a86970b3c0313905a6.png

我们替换第一个空格,这个字符串变成下图中的内容:

b9385c2a9f08b25140083f6fd10de1aa.png

表格中灰色背景的格子表示需要做移动的区域。接着我们替换第二个空格,替换之后的内容如下图所示:

c5cb17d18f229fa71319ce9137ca2a20.png

同时,我们注意到用深灰色背景标注的"happy"部分被移动了两次。

假设字符串的长度是n。对每个空格字符,需要移动后面O(n)个字符,因此对含有O(n)个空格字符的字符串而言总的时间效率是O(n2)。

在前面的分析中,我们发现数组中很多字符都移动了很多次,能不能减少移动次数呢?答案是肯定的。我们换一种思路,把从前向后替

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值