摘要:
【题 目】输入一个表示整数的字符串,把该字符串转换成整数并输出。例如:输入“123”,输出整数123. 【思 路】当然首先想到的就是C语言库函数atoi,一行代码就完事了,当然我们是想不借助该库函数来实现自己的算法。首先,我们考虑怎么把字符串转换成整数,我们输入“123”,我们可以遍历这个字符串,首先读入1,然后读到2,这时我们想要的是12=1×10+2;然后读入3,我们想要的是123=12×10+3;分析到这里,我们就会发现,我们只需要注意遍历每一个字符,将已经得到的数字×10然后加上该字符,就能得到整数了,用一个循环就可以轻松搞定。 算法的主体框架算是完成了, 阅读全文
摘要:
【题 目】数组中有一个数字的出现次数超过了该数组长度的一半,找出这个数字。 【思 路1】由于要寻找的数字的出现次数超过了数组长度的一半,所以如果将该数组排序,那么它的中位数必然是我们要寻找的数字,所以我们的任务就是对该数组进行排序,而性能最好的快速排序的时间复杂度为O(nlogn),我们可以直接借助库函数完成,由于其效率不是很高,所以这里就不再赘述。 【思 路2】对于一个数组中的元素的次数的统计,最快的查找方法是什么?当然哈希表了!我们能不能建立哈希表呢,稍微思考,我们就可以发现,哈希表只适用于元素的范围比较小的情况,而假设我们的数组是一个整型数组,取值范围跨度太大,所以不适合用哈希... 阅读全文
摘要:
【题 目】输入一个整数n,求从1到n这n个正数中,1出现的次数。例如:输入12,出现一的数字有1,10,11,12共有5个1,则输出5. 【思 路1】几乎所有的算法题目都有很直观容易想到的方法,当然这类方法的效率通常都不是很好,然而解决问题是第一要义。所以还是从最容易想到的入手。我们可以遍历从1到n的每一个数字k,对于k我们计算出它其中包含的1的个数,方法其实很简单,只需要分别判断个位,十位,百位,千位等的每一位是否为1,然后用计数器记录就OK了。这种思路很简单,我们很容易就可以写出如下的代码: 1 #include<iostream> 2 #include<string&g 阅读全文
摘要:
【题 目】输入两个字符串,从第一个字符串中删除第二个字符串中出现的所有字符。例如:输入"they are students." 与 “aeiou”,则应该输出“thy r stdnts.”。 【思 路1】首先我们还是以解决问题为第一要义,寻找最为直观的解决方案,很容易想到的方法就是,对于在第一个字符串中的每一个字符,拿它去查找是否在第二个字符串中出现过,如果是,则删除,如果不是则保留。删除一个字符,要让该字符之后的所有字符逐一向前移位,所以时间复杂度为O(n),对于长度为n的字符串,总的时间复杂度为O(N2).而对于给定的字符,在第二个字符串中查找该字符,如果遍历长度为m的 阅读全文
摘要:
【题 目】在一个字符串找到第一个只出现一次的字符。例如:输入字符串abaccdeff,输出b。【思 路1】其实我看到这道题的第一个反应就是哈希表呀!当然我是学习过哈希表之后才这么说的,对于之前,我们的思路当然是,从头到尾遍历字符串,对于遍历到的每一个字符,拿它后面的每一个字符和它比较,如果没有和它相等的字符,那么它就是我们所要找的。很容看出来这种算法的时间复杂度是O(n2).【思 路2】当然哈希表啦!所有学习过哈希表的同学都知道哈希表的查找速度是O(1)。我的第一个反映是建立26个字母的哈希表,当然这没有包含各种标点符号,控制字符等,所以为了全面起见,我们建立长度为256的哈希表(每一个cha 阅读全文
摘要:
【题 目】输入一个整型的数组,调整数组的数字,使得所有的奇数位于数组的前半部分,所有的偶数都位于数组的后半部分。要求时间复杂度为O(n)。 【思 路1】首先我们不考虑时间复杂度的要求,直观考虑:我们只需要从头到尾扫描整个数组,如果碰到奇数,放到第一的位置;如果碰到偶数,就放到最后的位置。这样就OK了。然后我们来分析这种算法的效率问题:首先我们需要一个临时变量来保存需要移动的元素,因而空间复杂度为O(1).时间上,对于第i个元素,它是奇数和偶数的概率各为1/2,因而它有1/2的概率向前移动(i-1)个位置,有1/2的概率想后移动(n-i)个位置,因而平均下来要移动(n-1)/2的位置,也就... 阅读全文
摘要:
【题 目】输入一个正整数数组,将他们连接起来排成一个数,输出所有排出的数字中最小的一个。例如:输入数组『32,321』,输出所能排出的最小数为:32132.请给出该问题的算法。 【思 路】我们希望能够找到一种规则,按照这种规则排列出来的数是最小的数。要确定排序的规则,我们就必须知道,对于任意两个正整数a和b,如果确定一个规则,使得按照该问题进行排序能得到最小的数,也就是要比较a和b的值,而这种比较不是普通的数值的大小。 对于数字a和b,排列的结果为ab和ba,如果ab小于ba,应该输出ab,即a排在b的前面,也就是a<b。反之,如果ba小于ab,即b排在a前面,也就是b<a。如果a 阅读全文
摘要:
【题 目】输入一个字符串,打印该字符串的所有排列。例如输入字符串abc,输出其全排列为abc,acb,bac,bca,cab,cba。【思 路】我们想一下,如果不编程,手工做的话,我们的基本考虑是:每次首先固定一个字母,然后让其余的字母全排列;然后换一个字母固定,再全排列其余的字母,如此循环而已。换句话说:假设长度为n的字符串排列方式是f(n),那么我们的基本思路是:每次让n个字母中的一个字母“打头阵”,其余的n-1个字母则按f(n-1)的方式排列。这样我们就明白这明显是递归思路。 递归最重要的问题是:结束的条件是什么?或者说,最小子问题是什么?还是以上面的abc例子来说明,首先固定a,然后. 阅读全文
摘要:
【题 目】一个整型数组中除了两个数字外,其他的数字都出现两次。请找出这两个只在数组中出现一次的数字。要求时间复杂度O(n),空间复杂度O(1)。【思 路】首先我们考虑一个稍微简单点的情况:如果这个数组中只有一个数字出现且仅出现一次,其他数字都出现两次,我们应该怎么样找出这个数字呢?我们题目说数字出现两次有什么深意呢?我们很容易联想到异或运算,因为任何一个数字和自身异或的结果为0;知道了这点,我们就很容易知道,我们将所有的数字进行异或,其结果就是仅出现一次的数字,因为其他所有的数字都两两异或为0了。 有了上面那个简单题目作为引子,我们很容易想到,如果我们将原题目的数组成功的分为两个子数组,而每. 阅读全文
摘要:
题外话:今天实在是太累了,但是为了能够坚持下去,还是决定写一个,不过题目很水,权当娱乐吧!【题 目】一个台阶一共有n阶,一次起跳可以跳一阶,也可以跳二阶。问总共有多少中跳法,并对时间复杂度进行分析。【思 路】由特殊到一般的思路吧,如果只有一阶,那么只有一种跳法;如果有2阶,那么有2中跳法(跳1阶再跳1阶,一次跳2阶);那么如果有n阶呢?假设对于n阶的阶梯,我们有f(n)中跳法;那么n阶时,我们考虑如果第一次跳共有两种选择:第一次跳了1阶,剩下n-1阶有f(n-1)种跳法;第一次跳了2阶,剩下的n-2阶有f(n-2)种跳法,那么总共的跳法数就是f(n-1)+f(n-2)。到这里我们可以看出这就是 阅读全文