算法面试题--正负交替

给一个包含正负整数的数组,要求对这个数组中的数进行重新排列,使得其正负交替出现。首先出现负数,然后是正数,然后是负数。有多余的一方,就放在末尾。

如 [1,2,3,-4]->[-4,1,2,3]

[1,-3,2,-4,-5]->[-3,1,-4,2,-5]

要求:使用O(1)的空间

问1:如果需要保持正数序列和负数序列各自原来的顺序,如何做,时间复杂度是多少?

问2:如果不需要保持正数序列和负数序列各自原来的顺序,如何做,时间复杂度是多少?

思路分析:题目要求只能使用O(1)的空间复杂度,也就是只能借助一个零时变量,想到如下思路,依次遍历数组中的每个元素,如果处在偶数位置的数是负数,处在奇数位置的数是正数就保持不变;如果处在偶数位置的数是正数,就该位置的下一个位置依次向后找到第一为负数的数,然后移动将找到的负数移动到偶数的位置(借助零时变量),同理对应处在奇数位置的数负数做类似的处理。

问1和问2的不同地方在于对处在偶数位置的数是正数或处在奇数位置的数是负数处理,问1因要保持原来的顺序,所以要依次移动元素,而问2不需要保持原来的顺序,所以可以直接交换。

问1代码,时间复杂度O(n^2):

void sortA(int arr[], int n)
{
	for (int i = 0; i < n; i++)
	{
		if (i % 2 == 0 && arr[i] < 0)
			continue;
		if (i % 2 == 1 && arr[i]>0)
			continue;
		if (i % 2 == 0 && arr[i]>0)
		{
			int j;
			int temp;
			for (j = i + 1; j < n && arr[j]>0; j++);
			if (j == n) break;
			else
			{
				temp = arr[j];
				for (; j > i; j--)
				{
					arr[j] = arr[j - 1];
				}
				arr[i] = temp;
			}
		}
		if (i % 2 == 1 && arr[i]<0)
		{
			int j;
			int temp;
			for (j = i + 1; j < n && arr[j]<0; j++);
			if (j == n) break;
			else
			{
				temp = arr[j];
				for (; j > i; j--)
				{
					arr[j] = arr[j - 1];
				}
				arr[i] = temp;
			}
		}
	}
}

问2代码,时间复杂度O(n):

void sortB(int arr[], int n)
{
	for (int i = 0; i < n; i++)
	{
		if (i % 2 == 0 && arr[i] < 0)
			continue;
		if (i % 2 == 1 && arr[i]>0)
			continue;
		if (i % 2 == 0 && arr[i]>0)
		{
			int j;
			int temp;
			for (j = i + 1; j < n&&arr[j]>0; j++);
			if (j == n) break;
			else
			{
				temp = arr[j];
				arr[j] = arr[i];
				arr[i] = temp;
			}
		}
		if (i % 2 == 1 && arr[i]<0)
		{
			int j;
			int temp;
			for (j = i + 1; j < n && arr[j]<0; j++);
			if (j == n) break;
			else
			{
				temp = arr[j];
				arr[j] = arr[i];
				arr[i] = temp;
			}
		}
	}
}
时间: 2024-10-10 08:52:38

算法面试题--正负交替的相关文章

数据结构与算法面试题80道

由于这些题,实在太火了.所以,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来.此也算是前80题第一次集体亮相. 此些题,已有上万人,看到或见识到,若私自据为己有,必定为有知之人识破,付出代价. 所以,作者声明: 本人July对以上所有任何内容和资料享有版权,转载请注明作者本人July出处. 向你的厚道致敬.谢谢. ------------------------------------------------------------------------------

若干数据结构 && 算法面试题【四】(更新ing)

这是我的第三个面试题汇总. 想看之前的内容,请移步: http://zhweizhi.blog.51cto.com/10800691/1763237 ( 若干数据结构 && 算法面试题[一](更新完毕)) http://zhweizhi.blog.51cto.com/10800691/1775780 ( 若干数据结构 && 算法面试题[二](更新完毕)) http://zhweizhi.blog.51cto.com/10800691/1787562 ( 若干数据结构 &am

若干数据结构 && 算法面试题【三】(更新中)

这是我的第三个面试题汇总. 想看之前的内容,请移步: http://zhweizhi.blog.51cto.com/10800691/1763237 ( 若干数据结构 && 算法面试题[一](更新完毕)) http://zhweizhi.blog.51cto.com/10800691/1775780 ( 若干数据结构 && 算法面试题[二](更新完毕)) 另外,我的全部刷题代码都在这里: https://github.com/HonestFox/BrushQuestion

算法面试题

在上一篇博客中有原有提到分享一下面试题,最近也是才能新公司入职没多久,忙着熟悉环境,加上前不久出去玩了一趟(顺便写了篇游记,感兴趣的可以看一看).所以一直没时间整理博客,这段时间周末终于闲下来,就趁着周末就记录了几个面试过程中碰到的算法题. 本篇博客不打算介绍那些高逼格的算法(如winnow,bagging,ada boost等等),就讲讲最近在面试过程中遇到的算法题以及面试的时候给出的答案(出场率比较高的算法题我都列出来了,其他的就不说了).算法可以说是解决所有问题的基石.很多东西都可以转换为

九章算法面试题43 直方图内最大矩阵

九章算法官网-原文网址 http://www.jiuzhang.com/problem/43/ 题目 给出一个直方图(如图所示),求出所给直方图中所包含的最大矩阵面积.直方图可以用一个整数数组表示,如上图为[2, 1, 5, 6, 2, 3].每个直方块的宽度均为1.上图中包含的最大矩阵面积为10. 解答 如果对于每个直方块,找到从它开始往左边数第一个比它小的,和往右边数第一个比他小的,则可以确定出以该直方块为最矮一块的矩阵的最大面积.使用数据结构栈,栈中保存递增序列,从左到右依次遍历每个数让其

九章算法面试题31 子数组的最大差

九章算法官网-原文网址 http://www.jiuzhang.com/problem/31/ 题目 给定一个数组,求两个不相交的并且是连续的子数组A和B(位置连续),满足|sum(A) - sum(B)|最大(和之差的绝对值).例如[2, -1, -2, 1, -4, 2, 8],可以得到A=[-1, -2, 1, -4], B=[2, 8],最大差为16. 解答 预处理每个位置往左/右的最大/最小子数组,然后再枚举划分位置,求得所有MaxLeft[i] - MinRight[i+1]和Max

九章算法面试题37 主元素

九章算法官网-原文网址 http://www.jiuzhang.com/problem/37/ 题目 主元素(Majority Number)定义为数组中出现次数严格超过一半的数.找到这个数.要求使用O(1)的额外空间和O(n)的时间. 进阶1:如果数组中存在且只存在一个出现次数严格超过1/3的数,找到这个数.要求使用O(1)的额外空间和O(n)的时间. 进阶2:如果数组中存在且只存在一个出现次数严格超过1/k的数,找到这个数.要求使用O(k)的额外空间和O(n)的时间 解答 采用抵消法.一旦发

九章算法面试题40 不用除法求积

九章算法官网-原文网址 http://www.jiuzhang.com/problem/40/ 题目 给定一个数组A[1..n],求数组B[1..n],使得B[i] = A[1] * A[2] .. * A[i-1] * A[i+1] .. * A[n].要求不要使用除法,且在O(n)的时间内完成,使用O(1)的额外空间(不包含B数组所占空间). 解答 计算前缀乘积Prefix[i] = A[1] * A[2] .. A[i],计算后缀乘积Suffix[i] = A[i] * A[i+1] ..

九章算法面试题50 队列上实现Min函数

九章算法官网-原文网址 http://www.jiuzhang.com/problem/50/ 题目 ?在<九章算法面试题23 栈上实现Min函数>中,我们介绍了在栈上实现一个O(1)的Min方法.那么,如何在队列上实现一个Min方法? 要求,队列除了支持基本的Push(x) Pop()的方法以外,还需要支持Min方法,返回当前队列中的最小元素.每个方法的均摊复杂度为O(1) 解答 在九章面试题49<用栈实现队列>和面试题23<栈上实现Min函数>中,我们讲解到了如何用