腾讯面试题:把负数移动到正数之前,不能改变正负数原先的次序

zhangtonghui816 2013-04-23 07:08:27
如:-5,7,1,9,-12,15 变成 -5,-12,7,1,9,15
空间复杂度O(1),时间复杂度O(N),排序稳定,如何解?
先谢谢大家了~
...全文
8035 156 打赏 收藏 转发到动态 举报
写回复
用AI写文章
156 条回复
切换为时间正序
请发表友善的回复…
发表回复
leon_unique 2013-04-28
  • 打赏
  • 举报
回复
引用 122 楼 cpp_1003050757 的回复:
104# 正解
有嵌套for...目测时间复杂度不满足
zhcosin 2013-04-27
  • 打赏
  • 举报
回复
引用 158 楼 zlgkaixin68 的回复:
定义一个 数组, 遍历原来的数组,找到的如果是负数,就存到数组里 然后再遍历一遍,如果是正数,就接着存到数组里。 这样就 先 负数,后正数,且 保持了原来的顺序。
人家早就说了要空间复杂度O(1),不知道为什么还有你这样的一群人在这瞎吼吼,莫非你们不知道啥是空间复杂度?
Panda_熊猫 2013-04-27
  • 打赏
  • 举报
回复
定义一个 数组, 遍历原来的数组,找到的如果是负数,就存到数组里 然后再遍历一遍,如果是正数,就接着存到数组里。 这样就 先 负数,后正数,且 保持了原来的顺序。
Panda_熊猫 2013-04-27
  • 打赏
  • 举报
回复
引用 25 楼 lfm13720 的回复:
用一个循环遍历数组,找到负数,就用memcpy把数组上一个负数到这个负数之前的内容移动一下,再把这个负数补到当前位置,这样不就好了么
握爪,和我的一样 22楼我的
gou12341234 2013-04-26
  • 打赏
  • 举报
回复
引用 143 楼 shiyuci 的回复:
[quote=引用 142 楼 gou12341234 的回复:] 每次把是负数的那个数跟她前面的最近的非负数交换,这样就不会改变原数组的顺序了
我试过不对[/quote] 不是只交换一次,直到这个负数前边没有正数为止,我没有实验过,只是在纸上画了一下。
你你大爷大爷 2013-04-26
  • 打赏
  • 举报
回复
引用 142 楼 gou12341234 的回复:
每次把是负数的那个数跟她前面的最近的非负数交换,这样就不会改变原数组的顺序了
我试过不对
gou12341234 2013-04-26
  • 打赏
  • 举报
回复
每次把是负数的那个数跟她前面的最近的非负数交换,这样就不会改变原数组的顺序了
你你大爷大爷 2013-04-26
  • 打赏
  • 举报
回复
 private static void changeorder(){
    	int o[]={-5,7,1,9,-12,15 };
    	int size=o.length;
    	int []temp=new int[size];
    	int lastIndex=0;//负数下标
    	int lastIndex_1=o.length;////正数下标
    	for (int i = 0; i < o.length; i++) {
    		if(o[i]<0){
    			temp[lastIndex] = o[i];
    			lastIndex++;
    		}
    		if(o[size-1-i] > 0){
    			temp[lastIndex_1-1]=o[size-1-i];
    			lastIndex_1--;
    		}
    	}
    	
    	for (int i = 0; i < temp.length; i++) {
			
    		System.out.println(temp[i]);
		}
    }
浪淘尽回 2013-04-26
  • 打赏
  • 举报
回复
引用 136 楼 cch920821 的回复:
#include<iostream> using namespace std; int main() { int a[6]={-5,7,1,9,-12,15}; int i,j,k,t; j=0; for(i=0;i<6;i++) { if(a[i]<0) ……
你先看懂题目要求把
浪淘尽回 2013-04-26
  • 打赏
  • 举报
回复
引用 138 楼 antsmall 的回复:
下面的这个吧. in.dat放 Plain Text code?123456-5 7 1 9 -12 15 代码如下: C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#inc……
别贴代码了,看懂题目再说吧
jiutoushe2008 2013-04-26
  • 打赏
  • 举报
回复
引用 143 楼 shiyuci 的回复:
[quote=引用 142 楼 gou12341234 的回复:] 每次把是负数的那个数跟她前面的最近的非负数交换,这样就不会改变原数组的顺序了
我试过不对[/quote]遇到负数呢???
jiutoushe2008 2013-04-26
  • 打赏
  • 举报
回复
引用 28 楼 SKATE11 的回复:
[quote=引用 27 楼 zhcosin 的回复:] 这个很简单啊,只需进行一次遍历即可,在遍历过程中保存到当前为止第一个正数的下标,每次遇到一个负数,就将此负数与当前记录的第一个正数进行位置交换,然后保存的第一个正数的下标增1,如此即可。
把代码写出来看看 [/quote]真个不稳定吧
abzhang2 2013-04-26
  • 打赏
  • 举报
回复
如果是数组的话,这个就麻烦了.
abzhang2 2013-04-26
  • 打赏
  • 举报
回复
前面的太长了, 如果是链表.可以这样.

int *pSourElem;         // 原始链表.

int *pPositivElem = 0;     // 正数位置. 

int *pNegativElem = 0;     // 负数位置.

for(pSourElem = head; pSourElem; pSourElem移动到下一个.)
{
    if(pSourElem < 0)  // 负数.
    {
          if(!pNegativElem)   // 遇到第一个负数.
               pNegativElem = pSourElem;
          else
               // 将pSourElem取出这个放到pNegativElem的下一个.
               // 然后更新pNegativElem

    }
    else             // 正数
    {
         //同上.
     }
}
ztenv 版主 2013-04-26
  • 打赏
  • 举报
回复
如果是链表则比较简单
生如夏花cch 2013-04-26
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
int main()
{
	int a[6]={-5,7,1,9,-12,15};
	int i,j,k,t;
	j=0;
	for(i=0;i<6;i++)
	{
		if(a[i]<0)
		{
			t=a[i];
			for(k=i;k>j;k--)
				a[k]=a[k-1];
			a[j]=t;
			j++;
		}
	}
		for(i=0;i<6;i++)
			cout<<a[i]<<"  ";
		return 0;
}
生如夏花cch 2013-04-26
  • 打赏
  • 举报
回复
引用 140 楼 huazifly 的回复:
[quote=引用 136 楼 cch920821 的回复:] #include<iostream> using namespace std; int main() { int a[6]={-5,7,1,9,-12,15}; int i,j,k,t; j=0; for(i=0;i<6;i++) { if(a[i]<0) ……
你先看懂题目要求把[/quote] 题目懂,看来你还不懂我的解法呀,哎!
#include<iostream>
using namespace std;
int main()
{
	int a[6]={-5,7,1,9,-12,15};
	int i,j,k,t;
	j=0;
	for(i=0;i<6;i++)
	{
		if(a[i]<0)
		{
			t=a[i];
			for(k=i;k>j;k--)
				a[k]=a[k-1];
			a[j]=t;
			j++;
		}
	}
		for(i=0;i<6;i++)
			cout<<a[i]<<"  ";
		return 0;
}
Acnzen 2013-04-26
  • 打赏
  • 举报
回复
java代码贴上。不知道符合要求不。时间复杂度,空间复杂度搞不懂。
package com.infosys.arithmetic;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class SpecifiedSort {

	public static void main(String[] args) {
		Integer[] data = { -5, 7, 1, 9, -12, 15 };
		System.out.println(Arrays.toString(data));
		specifiedSort(data);
		System.out.println(Arrays.toString(data));
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void specifiedSort(Comparable data[]) {
		int negative = 0;
		Queue<Comparable> queue = new LinkedList<Comparable>();
		for (int index = data.length - 1; index >= 0; index--) {
			if (data[index].compareTo(0) > 0 && index != data.length - 1
					&& negative != 0) {
				data[index + negative] = data[index];
			}
			if (data[index].compareTo(0) < 0) {
				negative++;
				queue.offer(data[index]);
			}
		}
		for (int i = negative - 1; i >= 0; i--) {
			data[i] = queue.poll();
		}
	}

}
最后打印出来的结果是:
[-5, 7, 1, 9, -12, 15]
[-5, -12, 7, 1, 9, 15]
wwzcx 2013-04-26
  • 打赏
  • 举报
回复
lm_whales 2013-04-26
  • 打赏
  • 举报
回复
T(N)=O(N)做不到,可以做到T(N)=O(N log N)
加载更多回复(136)
课程背景Modbus 协议是工业自动化控制系统中常见的通信协议,协议的全面理解是个痛点。本课程主讲老师集10多年在Modbus协议学习、使用中的经验心得,结合当前物联网浪潮下Modbus协议开发的痛点,推出这套面向Modbus 协议初学者的课程。本课程不同于以往市面课程只是协议讲解无实现代码,而是采用讲解与实践并重的方式,结合STM32F103ZET6开发板进行手把手编程实践,十分有利于初学者学习。涵盖了学习者在Modbus协议方面会遇到的方方面面的问题,是目前全网首个对Modbus协议进行全面总结的课程。课程名称   协议讲解及实现>>课程内容1、Modbus 协议的基础。2、Modbus协议栈函数编程实现。3、Modbus协议在串行链路编程实现。4、Modbus协议在以太网链路编程实现。5、常见问题的解决方法。带给您的价值通过学习本课程,您可以做到如下:1、全面彻底的理解Modbus协议。2、理解在串行链路,以太网链路的实现。3、掌握Modbus协议解析的函数编程方法,调试工具的使用。4、掌握多个串口,网口同时运行同一个Modbus协议栈的方法。5、掌握Modbus协议下,负数,浮点数等处理方法。讲师简介许孝刚,山东大学工程硕士,副高职称,技术总监。10多年丰富嵌入式系统开发经验,国家软考“嵌入式系统设计师”。2017年获得“华为开发者社区杰出贡献者”奖励。

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧