题解 | #调整数组顺序使奇数位于偶数前面(一)#

调整数组顺序使奇数位于偶数前面(一)

https://www.nowcoder.com/practice/ef1f53ef31ca408cada5093c8780f44b

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> reOrderArray(vector<int>& array) {
        // write code here
        if(array.empty())return vector<int>();

        //类似与插入排序
        int l = -1;
        int r = 0;
        while(r < array.size()){
            if(array[r] % 2 == 1){

                int tmp = array[r];
                for(int i = r;i > l + 1;i -= 1){
                    array[i] = array[i - 1];
                }
                l += 1;
                array[l] = tmp;
            }
            r += 1;
        }
        return array;
    }
};

题解二:不使用额外的空间,使用双指针,一个指针负责指明奇数的范围,一个指针负责寻找奇数,在一开始的时候,指向奇数范围的指针必须先是-1,这方便以后的判断,如果负责寻找奇数的指针找到了奇数,首先先将两个指针之间的数据都向右移动一位,然后将原先右指针指向的奇数放入左指针的下一个位置,然后奇数范围扩张。时间复杂度是O(n * n),空间复杂度是O(1)。有点类似于插入排序吧。

class Solution {
vector<int> reOrderArray(vector<int>& array) {
        // write code here
        if(array.empty())return vector<int>();
        //偶数
        vector<int> tmp1;
        //奇数
        vector<int> tmp2;
        for(int i = 0;i < array.size();i++){
            if(array[i] % 2 == 0)tmp1.push_back(array[i]);
            else tmp2.push_back(array[i]);
        }
        if(tmp1.empty())return tmp2;
        if(tmp2.empty())return tmp1;

        for(int i = 0;i < tmp1.size();i += 1){
            tmp2.push_back(tmp1[i]);
        }
        return tmp2;
    }
 

题解一:通过分离出数组的奇数和偶数,然后将偶数数组的元素都压入奇数队列,最后返回奇数队列即可,时间复杂度是O(n),空间复杂度是O(n)。

全部评论

相关推荐

会飞的猿:我看你想进大厂,我给你总结一下学习路线吧,java语言方面常规八股要熟,那些java的集合,重点背hashmap八股吧,jvm类加载机制,运行时分区,垃圾回收算法,垃圾回收器CMS、G1这些,各种乐观锁悲观锁,线程安全,threadlocal这些。在进阶一些的比如jvm参数,内存溢出泄漏排查,jvm调优。我这里说的只是冰山一角,详细八股可以去网上找,这不用去买,都免费资源。mysql、redis可以去看小林coding,我看你简历上写了,你一定要熟,什么底层b+树、索引结构、innodb、mvcc、undo log、redo log、行级锁表级锁,这些东西高频出现,如果面试官问我这些我都能笑出来。消息队列rabbitmq也好kafka也好,学一种就行,什么分区啊副本啊确认机制啊怎么保证不重复消费、怎么保证消息不丢失这些基本的一定要会,进阶一点的比如LEO、高水位线、kafka和rocketmq底层零拷贝的区别等等。计算机网络和操作系统既然你是科班应该理解起来问题不大,去看小林coding这两块吧,深度够了。spring boot的八股好好看看吧,一般字节腾讯不这么问,其他的java大厂挺爱问的,什么循环依赖啥的去网上看看。数据结构的话科班应该问题不大,多去力扣集中突击刷题吧。项目的话其实说白了还是结合八股来,想一想你写的这些技术会给你挖什么坑。除此之外,还有场景题、rpc、设计模式、linux命令、ddd等。不会的就别往简历上写了,虽然技术栈很多的话好看些,但背起来确实累。总结一下,多去实习吧,多跳槽,直到跳到一个不错的中厂做跳板,这是一条可行的进大厂的路线。另外,只想找个小厂的工作的话,没必要全都照这些准备,太累了,重点放在框架的使用和一些基础八股吧。大致路线就这样,没啥太多难度,就是量大,你能达到什么高度取决于你对自己多狠,祝好。
点赞 评论 收藏
分享
数开小菜鸡:虽然我看不太懂,但我觉得很nb
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务