重新排列数组leetcode1470题

重新排列数组leetcode1470题

题目:

1470. 重新排列数组
给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。

请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列,返回重排后的数组。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shuffle-the-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的初始解:

 /**
     * @Description TODO
     * @Param [nums, n]
     * @return int[]
     * @date 2020/7/15 22:25
     * @author huanl
     * 思路: 我最先想到的是先把后面一半拿出来,然后在进行组合,后面我想,为什么我要全部拿出来呢?不能直接进行操作吗?可以啊,可以直接进行操作啊
     * 那怎么去操作呢? 首先定义一个用于接收重新排列后的数组,那后面就只要将原数组的值按照规定的要求放入即可,这个就是一个函数的问题了.
     *
     * 时间复杂度: O(n)
     * 空间复杂度: O(n)
     */
    public static int[] shuffle(int[] nums, int n) {
        int[] ret = new int[nums.length];
        for(int i = 0;i<n;i++){
            ret[2*i] = nums[i];
            ret[2*i+1] = nums[n+i];
        }
        return ret;
    }

优解

此解法主要是将空间复杂度大幅度降低了,没有使用额外的空间,但是有一点我有点不懂,就是为什么nums[i]&1023? 这个的意义是什么?为什么不加就会有一部分答案出错.

  /**
     * @Description TODO
     * @Param [nums, n]
     * @return int[]
     * @date 2020/7/15 23:13
     * @author huanl
     */
    public static int[] shuffle1(int[] nums, int n) {

        // 将需要排序的值放到对应位置上去,f就是对应位置的序号
        for (int i = 0; i < nums.length ; i++) {
            int f = i < n?(2*i):(2*(i-n)+1);
            nums[f] = nums[f] | ((nums[i] &1023 )<<10);  
            System.out.println("-----");
        }
        //将得到的值放到最后
        for (int i = 0; i < nums.length; i++) {
            nums[i]>>=10;

        }
        return nums;
    }

总结

1. 感觉比昨天有了提高,虽然第一想法还是去把后半部分直接拿出来,然后再操作,但是至少想到这里之后会去问自己一下,到底是不是真的有必要拿出来?拿出来的意义在哪里?可不可以不拿出来?
2. 加油!不积硅步,无以至千里!
posted @ 2020-07-15 23:19  HuanL  阅读(365)  评论(0)    收藏  举报