4.19头条后端面试题

一个未排序整数数组,有正负数和零,重新排列使负数排在正数前面([负数-0-正数]),并且要求不改变原来的相对顺序。

比如:

输入:[1,7,-5,9,0,-12,15]

输出:[-5,-12,0,1,7,9,15]

要求时间复杂度O(N),空间O(1)


简单回应一下评论里的什么冒泡/插入…
要满足时间复杂度O(N),空间复杂度O(1),也就是只能使用有限次循环(嵌套循环,递归基本都不用考虑),且不能用数组、列表、链表等集合结构,只能用有限个临时变量缓存数据。
主要困难在有限次循环的过程中,怎么样消除移动元素时出现的逆序。
麻烦会的大佬pull个代码
#面经##春招##笔试题目#
全部评论
如果能做到这样那快排不就可以做到O(nlogn)且保持稳定性吗
点赞 回复 分享
发布于 2019-04-20 08:34
先扫一遍找出0或者离0最近的数O(n),作为基准,然后只跑一轮快排O(n),结束
点赞 回复 分享
发布于 2019-04-20 02:24
mark,这题整出来,坑人的吧
点赞 回复 分享
发布于 2019-04-20 00:44
public void sort(int[] nums){ int len = nums.length; int first = 0; int last = len; int mid = 0; while(mid<last){ if(nums[mid]<0){ if (mid==first){ mid++; first++; continue; } int i = mid; int tmp = nums[mid]; while(i>first){ nums[i]= nums[i-1]; i--; } nums[first] = tmp; first++; } else if(nums[mid]>0){ int i = mid; int tmp = nums[mid]; while(i<len-1){ nums[i] = nums[i+1]; i++; } nums[len-1]=tmp; last--; } else{ mid++; } } }
点赞 回复 分享
发布于 2019-04-20 13:04
快排不能有序,做不了
点赞 回复 分享
发布于 2019-04-20 12:06
既要稳定性又要O(n)和O(1),左神不是说目前还是实现不了吗🤔
点赞 回复 分享
发布于 2019-04-20 08:55
def reOrderArray(L):     if not L:         return L     i, N = 0, len(L)     while i < N:         while i < N and L[i] < 0:             i += 1         j = i + 1         while j < N and L[j] > 0:             j += 1         if j < N:             L[i], L[i+1:j+1] = L[j], L[i:j]         else:             break     return L
点赞 回复 分享
发布于 2019-05-21 00:27
打印一份0-1 stablesort的paper拍在面试官脸上
点赞 回复 分享
发布于 2019-04-27 21:29
先遍历一遍数组,记录正数个数和负数个数,然后再从头遍历,调整位置。
点赞 回复 分享
发布于 2019-04-27 21:09
等一个答案
点赞 回复 分享
发布于 2019-04-27 00:28
只能从稳定排序里挑吧,冒泡或者插入?但是要O(N)好像有点难
点赞 回复 分享
发布于 2019-04-20 18:48
跑一次快排的partition就行了
点赞 回复 分享
发布于 2019-04-20 18:03
做不了……
点赞 回复 分享
发布于 2019-04-20 12:34
快排不好保证有序啊
点赞 回复 分享
发布于 2019-04-20 12:00
m
点赞 回复 分享
发布于 2019-04-20 10:38
void func(vector& arr) { int m = 0, n, p = arr.size()-1, q; for (int i = 0; i < arr.size(); ++i) { if (arr[i] < 0) { n = i; while (i > m) { swap(arr[i--], arr[i]); } m++; i = n; } } for (int i = arr.size()-1; i >=0;--i) { if (arr[i] > 0) { q = i; while (i < p) { swap(arr[i++], arr[i]); } p--; i = q; } } }
点赞 回复 分享
发布于 2019-04-20 10:19
同向双指针遍历一遍即可
点赞 回复 分享
发布于 2019-04-20 09:02
剑指原题稍微变了一下,,
点赞 回复 分享
发布于 2019-04-20 08:59
m
点赞 回复 分享
发布于 2019-04-20 08:27
Leetcode 75 
点赞 回复 分享
发布于 2019-04-20 03:13

相关推荐

09-13 18:00
武汉大学 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
5
52
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务