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个代码
#面经##春招##笔试题目#
全部评论
mark,这题整出来,坑人的吧
点赞 回复 分享
发布于 2019-04-20 00:44
先扫一遍找出0或者离0最近的数O(n),作为基准,然后只跑一轮快排O(n),结束
点赞 回复 分享
发布于 2019-04-20 02:24
如果能做到这样那快排不就可以做到O(nlogn)且保持稳定性吗
点赞 回复 分享
发布于 2019-04-20 08:34
既要稳定性又要O(n)和O(1),左神不是说目前还是实现不了吗🤔
点赞 回复 分享
发布于 2019-04-20 08:55
快排不能有序,做不了
点赞 回复 分享
发布于 2019-04-20 12:06
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
你这个输出中1和0的相对顺序不是变了吗
点赞 回复 分享
发布于 2019-04-20 00:48
这两个复杂度搞不定的吧
点赞 回复 分享
发布于 2019-04-20 00:58
冒泡一轮不就可以了嘛
点赞 回复 分享
发布于 2019-04-20 01:02
插入排序吧
点赞 回复 分享
发布于 2019-04-20 01:04
明天给你写,今天太晚了
点赞 回复 分享
发布于 2019-04-20 01:55
给你个思路吧,快徘的原理
点赞 回复 分享
发布于 2019-04-20 02:15
荷兰国旗问题?
点赞 回复 分享
发布于 2019-04-20 02:56
Leetcode 75 
点赞 回复 分享
发布于 2019-04-20 03:13
m
点赞 回复 分享
发布于 2019-04-20 08:27
剑指原题稍微变了一下,,
点赞 回复 分享
发布于 2019-04-20 08:59
同向双指针遍历一遍即可
点赞 回复 分享
发布于 2019-04-20 09:02
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
m
点赞 回复 分享
发布于 2019-04-20 10:38
快排不好保证有序啊
点赞 回复 分享
发布于 2019-04-20 12:00

相关推荐

5 52 评论
分享
牛客网
牛客企业服务