摘要:
【题 目】某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄进行排序,可以使用O(1)的辅助空间。【思 路】在数据结构和算法的学习中,排序肯定是重中之重,然而仔细回想我们学习过的排序算法,无论是冒泡排序,归并排序,插入排序,希尔排序,甚至著名的快速排序,时间复杂度都达不到O(n),这些算法的时间复杂度要么为O(n2),要么为O(nlogn),然而这道题却要求我们用O(n)的时间复杂度排序,到底是什么原因呢? 通过简单的思考,我们发现,员工虽然有几万名,但是要排序的年龄却不是只有几万种,我们考虑一个人正常的工作年龄22——60岁,再发到范围也不过0——99岁(夸张了点). 阅读全文
摘要:
【题 目】输入一个整数,输出所有和为n的连续正数序列。例如:输入15,由于15=7+8=4+5+6=1+2+3+4+5,所以输出的序列为『1,2,3,4,5』;『4,5,6』,『7,8』三个。【思路1】从等差数列的观点考虑:如果有一列数满足i+(i+1)+...+j=n,根据等差数列的求和公式,我们容易得到:(i+j)(j-i+1)/2=n,即(i+j)(j-i+1)=2n,由于i,j均为正整数,我们容易得到(i+j),(j-i+1)也都为正整数,所以都是2n的因子,我们就可以从2到sqrt(2n)遍历2n的所有因子,对于其中的因子k,我们有: 我们只需要保证j,i的值都为整数,并且i< 阅读全文
摘要:
【题 目】输入一个已经按升序排列的数组,一个给定的数字,在数组中查找两个数,使得它们的和等于给定的数字。要求时间复杂度为O(n),如果存在多对满足条件的数字对,只给出一对即可。例如:输入数组『1,2,4,7,11,15』,给定一个数字15,那么输出应该为『4,11』.【思路1】我们先不考虑时间复杂度为O(n),按照最直观的思路来考虑,容易想到,我们一次固定数组中的一个数字,然后遍历这个数字之后的各个数字,判断和是否为给定的和,这样的时间复杂度为O(n2)。容易写出如下的代码: 1 #include<iostream> 2 #include<string> 3 using 阅读全文
摘要:
题目:输入一个整数,判断该正数的二进制表示中有多少个1?例如:输入整数12,转换成二进制是1100,共有2个1,因而应该输出2. 分析1:我们可以这样考虑,从右向左注意判断每一个位上是否为1,怎么判断?我们让这个数和整数1(01)做与运算,由于1除最后一位外其余部分全部都是0,因而如果整数的最... 阅读全文
摘要:
题目:数组中,数字减去它右边(不要求相邻)的数字得到一个数对之差。求所有数对之差的最大值。例如:数组{2, 4, 1, 16, 7, 5, 11, 9},数对之差的最大值是11,是16-5的结果。 分析1:这道题我们同样可以用遍历的方法,固定一个数字,然后逐一减去它右边的数字,得到各个数对之差... 阅读全文
摘要:
题目:输入一个整型数组,数组里面有正数也有负数,数组中的连续一个或者多个整数组成一个子数组,每一个子数组都有一个和,求所有子数组和的最大值。要求时间复杂度为O(n)。 例如:输入数组为{1,-2,3,10,-4,7,2,-5},和的最大子数组为{3,10,-4,7,2},因此输出为子数组的和1... 阅读全文
摘要:
题目:给定一个矩阵,从外向内顺时针打印矩阵中的每一个数字。例如:给定矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16输出应该为:{1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10}分析:这道题的意思非常直观,给人的感觉也是s... 阅读全文
摘要:
题目:字符串的左旋转操作:把字符串前面的若干字符移到字符串的后面。例如:字符串abcdefg左旋转2位得到cdefgab。请实现左旋转字符串函数,要求对于长度为n的字符串,时间复杂度为O(n),辅助内存为O(1)。分析1:看到这道题我们最直观的思路就是:如果要把长度为n的字符串左移k位,那么我们可以... 阅读全文
摘要:
题目:随机抽取扑克牌中的5张牌,判断是不是顺子,即这5张牌是不是连续的。其中A看成1,J看成11,Q看成12,K看成13,大小王可以看成任何需要的数字。分析1:这道题的意思很明确,我们玩扑克的过程中,也经常碰到这样的情况。我们先看看在现实生活中,我们是怎么样处理的,我想大部分人都是这样做的:先把5张... 阅读全文
摘要:
题目:把n个骰子仍在地上,所有骰子的点数和为s。输入n,打印s所有可能取值的概率。分析1:容易知道,有n个骰子的话,s的最小取值为n(全为1),最大取值为6n(全为6)。如果只有1个骰子,那么很简单,s取1,2,3,4,5,6的情况数均为1,概率为1/6;设想有n个骰子,出现和为s,我们可以这样考虑... 阅读全文