算法试题 - 数组、集合

 

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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值