剑指offer - 面试题21: 调整数组顺序使奇数位于偶数前面 - C++

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        int len = array.size();
        vector<int> odd, even;
        for(int i=0; i<len; i++) {
            if((array[i]&0x1) == 1) {
                odd.push_back(array[i]);
            } else {
                even.push_back(array[i]);
            }
        }
        int oddLen = odd.size(), evenLen = even.size();
        for(int i=0; i<oddLen; i++) {
            array[i] = odd[i];
        }
        for(int i=0; i<evenLen; i++) {
            array[oddLen+i] = even[i];
        }
    }
};

这种方法以空间换时间。代码还算简洁。

因为要求稳定性暂时没想到时间复杂度n,空间复杂度1的算法。

刚开始写了一个不稳定的(本以为稳定),写的还挺复杂,除了稳定性功能应该没问题,贴出来:

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        int len = array.size();
        int index1 = -1, index2 = -1;
        for(int i=0; i<len; i++) {  // 寻找第一个偶数
            if((array[i] & 0x1) == 0) {
                index1 = i;
                break;
            }
        }
        if (index1<0 || index1 == len-1) return;  // 没有偶数或最后一个数是偶数  
      
        for(int i=index1+1; i<len; i++) {
            if((array[i] & 0x1) == 1) {
                index2 = i;
                break;
            }
        }
        if (index2 < 0) return;  // 后面没有奇数了
         
        while(index2<len) {
            swap(array, index1, index2);
            index1++;
            index2++;
            while((array[index2] & 0x1) == 0 && index2<len-1) {
                index2++;
            }
        }
        return;
    }
    void swap(vector<int> &array, int index1, int index2) {
        int temp = array[index1];
        array[index1] = array[index2];
        array[index2] = temp;
    }
};

那些没过的原因:

&比==优先级低,判断的时候要加括号

用了swap却忘写

引用的传值不太清楚;

for循环中;写成 ,

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值