1. 有一个整数数组,请求出两两之差绝对值最小的值。
2. 一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。
设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。复杂度不能为O(n2)。
3. 给定一个集合A=[0, 1, 3, 8] (该集合中的元素都是在0,9之间的数字,但未必全部包含),指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。比如,A=[1, 0] K=21 那么输出结构应该为100。
4. 一个有序数列,序列中的每一个值都能够被2或者3或者5所整除,1是这个序列的第一个元素。求第1500个值是多少?
5. 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。
每个数组元素只能访问一次,设计一个算法,将它找出来,不用辅助存储空间。
6. 一个含n个元素的整数数组至少存在一个重复数,请编程实现,在O(n)时间内找出其中任意一个重复数。
7. 输入a1,a2,...,an,b1,b2,...,bn, 在O(n)的时间,O(1)的空间将这个序列顺序改为a1,b1,a2,b2,a3,b3,...,an,bn,且不需要移动,通过交换完成,只需一个交换空间。
8. 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。要求:空间复杂度O(1),时间复杂度为O(n)。
9. 输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如:输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
10. 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求:时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如:输入数组1, 2, 4, 7, 11, 15和数字15。由于4 + 11 = 15,因此输出4和11。
11. 有两个序列a, b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a, b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:
var a=[100, 99, 98, 1, 2, 3];
var b=[1, 2, 3, 4, 5, 40];
12. 求一个矩阵中最大的二维矩阵(元素和最大)。如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码。
13. 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值。
比如{3, 2, 4, 3, 6}可以分成
{3, 2, 4, 3, 6} m=1;
{3, 6} {2, 4, 3} m=2
{3, 3} {2, 4} {6} m=3
所以m的最大值为3
14. 求一个数组的最长递减子序列 比如{9, 4, 3, 2, 5, 4, 3, 2}的最长递减子序列为{9, 5, 4, 3, 2}。
15. 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)。
16. 输入一个正数n,输出所有和为n连续正数序列。
例如:输入15,由于1+2+3+4+5 = 4+5+6 = 7+8 = 15,所以输出3个连续序列1-5, 4-6和7-8。
17. 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。
要求:空间复杂度O(1),时间复杂度为O(n)。
18. 一个整型数组里除了两个数字之外,其他的数字都出现了两次。
请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
19. 输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。
20. 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。
例如:数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
21. 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
22. 一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。
能否只用一个额外数组和少量其它空间实现。
23. 在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
24. 求随机数构成的数组中找到长度大于等于3的最长的等差数列,输出等差数列由小到大。
格式:
输入[1, 3, 0, 5, -1, 6]
输出[-1, 1, 3, 5]
要求时间复杂度,空间复杂度尽量小。
25. 递归法求数组中的最大值。
26. 用递归的方法判断整数组a[N]是不是升序排列。
27. 计算数组中连续元素和的最大值。
28. 一个m*n矩阵A,其中m>=1K且n>=100K。 Xi是A的行向量,其中1<=i<=M。换句话说,A={X1,X2,...,Xm}。请用一个最快的算法来检测所有的(Xi,Xj)对,其中Xi==Xj。
29. 根据上排给出的十个数,在其下排填出对应的十个数。要求下排每个数都是上排那十个数在下排出现的次数。
上排的十个数如下:0, 1, 2, 3, 4, 5, 6, 7, 8, 9
举一个例子,
数值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0在下排出现了6次,1在下排出现了2次,2在下排出现了1次,3在下排出现了0次,以此类推…
30. n个数字(0, 1, … , n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
求出在这个圆圈中剩下的最后一个数字。
31. 输入两个整数 n 和 m,从数列1,2,3...n 中随意取几个数,使其和等于 m,要求将其中所有的可能组合列出来。
32. 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。
例如,输入12,从1到12这些整数中包含1 的数字有1, 10, 11和12,1一共出现了5次。
33. 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移两位形成的。
在这种数组中查找某一个数。
34. 给出两个集合A和B,其中集合A={name},集合B={age、sex、scholarship、address、...}.
问题1、根据集合A中的name查询出集合B中对应的属性信息;
问题2、根据集合B中的属性信息(单个属性,如age<20等),查询出集合A中对应的name。
35. 设A[1…n]是一个包含n个不同数的序列。如果在i<j的情况下,有A[i]>A[j],则 (i, j)就称为A中的一个逆序对。
比如,数组A=[176, 178, 180, 170, 171],A的逆序对为:(176, 170), (176, 171), (178, 170), (178, 171), (180, 170), (180, 171)。
现在给出一个整型序列,请找出所有的逆序对的个数。
输入:为一个文件(in),文件的每一行为一个序列。序列全为数字,数字间用”,”分隔。
输出:为一个文件(out),每行为一个数字,表示逆序对的个数。
分析时间复杂度。(说明:输入每行的最大数字个数为100000个,数字最长为6位。程序无内存使用限制)
36. 在数组中,数字减去它右边的数字得到一个数对之差。
求所有数对之差的最大值。
例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。
37. 输入一个整数,求该整数的二进制表达中有多少个1。