![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数组
文章平均质量分 64
Sunny君
这个作者很懒,什么都没留下…
展开
-
数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过了数组长度的一半,因此输出2. 分析:我们直观的想到,如果是排序的数组,我们就很容易统计出来每一个数字出现的次数。排序的时间复杂度是O(nlogn)。 不是最快的算法 测试用例: 功能测试(数组中存在一个数字出现的次数超过数原创 2018-01-11 21:51:57 · 215 阅读 · 0 评论 -
数组中只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度是O(1)。 分析:例如输入数组{2,4,3,6,3,2,5,5},因为只有4、6这两个数字只出现了一次,其他数字都出现了两次,所以输出4和6。我们可以先考虑这个数组中只有一个数字只出现了一次,其他的都出现了两次,来找出这个数字。异或运算的一个性质:任何一个数字异原创 2018-01-19 21:19:32 · 150 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数,例如输入排序数组{1,2,3,3,3,3,4,5},由于3在这个数组中出现了4次,因此输出4。思路:既然数组是排序的,那我们自然就能想到用二分查找算法。在题目给出的例子中,我们可以先用二分查找算法找到一个3.由于3出现了很多次,因此我们找到的3的左右两边都有3,于是我们在找到3的左右两边顺序扫描,分别找到第一个3和最后一个3。因为我们要查找的数字在长度为n原创 2018-01-19 10:51:36 · 272 阅读 · 0 评论 -
顺时针打印矩阵
题目:输入一个矩阵。按照从外向里以顺时针的顺序依次打印出每一个数字。例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10 分析:我们可以用循环来打印矩阵,每一次打印矩阵中的一个圈。接下来分析循环结束的条件。假设这个矩阵的行数为原创 2018-01-08 16:12:45 · 104 阅读 · 0 评论 -
数组中的逆序对
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 分析:分治思想,采用归并排序的思路来处理 先把数组分解成两个长度为2的子数组,再把这两个子数组分解成两个长度为1的子数组。接下来一边合并相邻的子数组,一边统计逆序对的数目。在第一对长度为1的子数组{7}、{5}中7>5,因此(7,5)组成一个逆序对。原创 2018-01-16 22:48:35 · 116 阅读 · 0 评论 -
把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起开排成一个数,打印拼接出来的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字排成的最小数字321323 分析:这个题目最直接的做法应该是先求出这个数组中所有数字的全排列,然后把每一个排列拼起来,最后求出拼起来的数字的最小值。但是这道题其实是希望我们能找到一个排序规则,数组按照这个规则排序之后能排成最小的数字。要确定排序规则原创 2018-01-15 14:27:37 · 151 阅读 · 0 评论 -
从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n这那个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11,和12,1一共出现了5次 解法一:不考虑时间效率的解法 最直观的解法就是累加1到n中每一个整数1出现的次数。我们可以通过对10求余数判断整数的个位数字是不是1,如果这个数字大于10,除以10之后再判断个位数字是不是1. int NumberOf1B原创 2018-01-12 16:30:51 · 166 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数的前面
题目:输入一个整数数组,实现一个函数来调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 分析:如果不考虑时间复杂度,可以直接遍历数组,当碰到第一个偶数的时候,拿出这个偶数,把这个数后面的所有数都往前面移动一个位置,之后数组的最后面会有一个空位,把这个偶数放进去。由于碰到一个偶数就需要移动O(n)个数组,因此总的时间复杂度就是O(n^2)。 假设我们数组为{1,原创 2018-01-04 16:21:41 · 482 阅读 · 0 评论 -
连续子数组的最大和
题目:输入一个整型数组,数组中有正数也有负数。数组中有一个或者连续的多个整数组组成一个子数组。求所有的子数组的和的最大值。要求时间复杂度为O(n)。 分析:例如输入的数组为{}1,-2,3,10,-4,7,2,-5},和最大子数组为{3,10,-4,7,2},因此输出为该子数组的和18。最直观的解法就是枚举出数组的所有子数组并求出它们的和。一个长度为n的数组,总共有n(n-1)/2个子数组。计算原创 2018-01-12 16:02:24 · 335 阅读 · 0 评论 -
最小的K个数
题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数是1、2、3、4. 测试用例:功能测试(输入的数组中有相同的数字,输入的数组中没有相同的数字) 边界值测试(输入的k等于1或者等于数组的长度) 特殊输入测试(k小于1,k大于数组的长度、指向数组的指针为NULL) 解法一:O(n)的算法,所使用Partition函数,只有我们可以修改输原创 2018-01-12 15:03:00 · 129 阅读 · 0 评论 -
和为S的两个数字VS和为S的连续正数序列
题目一:输入一个递增序列的数组和一个数字S,在数组中查找两个数,使得它们的和正好是S。如果有多对数字的和等于S,输出任意一对即可。 分析:例如输入数组{1、2、4、7、11、15}和数字15。由于4+11=15,因此输出4和11。 首先想到可以用两个循环嵌套来查找,但是时间复杂度O(n^2)。显然不是最好的解法,下面我们寻找更加好的解法,我们可以使用两个指针。首先定义两个指针,第一个指针指向数原创 2018-01-19 22:15:12 · 150 阅读 · 0 评论