代码面试题:Interleaving Negative and Positive Numbers 正负交替

本文介绍了一种在不改变序列顺序的情况下,将数组中的正负数交替排列的算法实现过程。通过遍历数组并寻找合适的元素位置进行循环右移操作,实现了正负数的交替排列。

Given an array with positive and negative integers. Resort the array so that positive and negative elements appear alternately, starting with a positive element. And ensure that the sequence of positive and negative arrays won't change. Do it in place.


For example: 

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

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


思路:遍历数组,寻找与要求不符合的元素位置a,在这个位置之后,寻找第一个符合要求的元素位置b,将这个数组从位置a到位置b循环右移,保证顺序不变。


    public void interleaveNumbers(int[] A) {
    	if (A == null || A.length <= 1) {
    		return;
    	}
    	
    	for (int i = 0; i < A.length - 1; i++) {
    		if (i % 2 == 0 && A[i] < 0) {
    			for (int j = i + 1; j < A.length; j++) {
    				if (A[j] > 0) {
    					insertForward(A, i, j);
    					break;
    				}
    			}
    		} else if (i % 2 == 1 && A[i] > 0) {
    			for (int j = i + 1; j < A.length; j++) {
    				if (A[j] < 0) {
    					insertForward(A, i, j);
    					break;
    				}
    			}
    		}
    	}
    	
    }
    
    private void insertForward(int[] A, int start, int end) {
    	int temp = A[end];
    	for (int i = end; i > start; i--) {
    		A[i] = A[i - 1];
    	}
    	A[start] = temp;
    }



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值