腾讯算法面试题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0(index )1234
517-59-1215
719-1215-5(1 和 -5 交换 暂存-5 到该位置)
17-1215-5
9(7和9交换 9暂存到改位置)
-5(-5原始index 是2,
这⾥是把原始位置上的-5插⼊到第0个位置)
17-1215
9 -5
179
15-12腾讯算法⾯试题
最近公司经常有些分享会,前⼏天有个某婚恋⽹元⽼级程序员跳到我们公司并做了次分享,内容是⼀些算法⽅⾯的。
闲来⽆事动动脑。
偶见⼀腾讯⾯试题
⼀个未排序整数数组,有正负数,重新排列使负数排在正数前⾯,并且要求不改变原来的 相对顺序 ⽐如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时间复杂度O(N),空间O(1)
这是我的代码,欢迎朋友指正:
public static void txsort(int [] array) {
int negCount = 0;
int length = array.length; int negIndex =0;
for(int i=0;i<length;i++) {
if(array[i]<0) negCount++; }
if(negCount==0) return ;
for(int i=0;i<length;i++) {
int posIndex = (i-negIndex)%(negCount-negIndex) + negIndex; int newIndex = i+negCount - negIndex; if(array[posIndex]<0) {
newIndex = negIndex; negIndex++; }
int temp = array[posIndex];
array[posIndex] = array[newIndex]; array[newIndex] = temp;
if(negIndex==negCount) break ; } }
思想如下: 题⽬要求空间O (1)in-place ,时间O (n ),且是必须是稳定的。
初⼀看像排序,排序算法中快排的时间复杂度是nlogn 。
在看⼀次题⽬, 只是把正负数分开,不涉及到从⼤到⼩。
审题很重要。
1 先找出负数的个数N
2 从前到后把元素向后移 负数个位⼦N , 把后⾯位置上的数先暂存到前⾯为负数留的位置上。
当移动 第N+I 时,此时N+I 其实是原数组的I ,⽽N+1 的真实值存在前⾯的I 位置上,所以这⾥移动的是I 到 N+ I+ N 去。
3 遇到负数就往前插 后⾯的数往后移动 N -1。
4 直到负数全到前⾯为⽌
难点: 因为不能开辟新的空间,否则不满⾜空间复杂度O (1),只能在数组内移动,所以就⽐较饶。
下⾯把移动演⽰⼀下:
-12
(把index 3上的9 往后移动
2(负数的总数) - 1(已经存好的负数个数))
就是把index3 移到index4上
-5-1217915要注意int posIndex = (i-negIndex)%(negCount-negIndex) + negIndex; 中的i-negIndex. 去掉已移动。