2020-09-04

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

每日学习一个算法——重新排列数组(本人菜鸟,自己学习)

 


题目

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

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

 

示例 1:

输入:nums = [2,5,1,3,4,7], n = 3
输出:[2,3,5,4,1,7] 
解释:由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7]
示例 2:

输入:nums = [1,2,3,4,4,3,2,1], n = 4
输出:[1,4,2,3,3,2,4,1]
示例 3:

输入:nums = [1,1,2,2], n = 2
输出:[1,2,1,2]
 

提示:

1 <= n <= 500
nums.length == 2n
1 <= nums[i] <= 10^3

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shuffle-the-array


提示:以下是本篇文章正文内容,下面案例可供参考

一、解题思路

首先,个人感觉,这个题目,在不建立一个新的数组的情况啊,是比较复杂和难的,因为这种情况下,要设置中间变量,元素位置还不能变,即使设置中间变量,还要思考中间变量应该放到哪个位置,还要找这个规律,而且第n个元素之后的元素,取一个就少一个,位置就空一个,也就说明中间变量就要多一个,个人认为行不通(也许大佬有好的方法,望批评指正)。

所以就直接考虑设置一个新的数组,新的数组sum的偶数位就是原数组num前n个元素依次排序,sum的奇数位就是num的后n个元素依次排序。

二、代码实现

1.第一遍

package SuanFa02;

import java.util.Scanner;

public class ShuZuPaiXu {
    public static void main(String[] args) {
        //以下内容与往常一样,字符串输入,转整型数组
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入一个数组,位数是偶数,中间以空格分隔");
        String[] str = scan.nextLine().split(  " ");//输入一串字符串(这里是单个数字),以空格分隔
        int[] sum = new int[str.length];
        for (int i = 0; i < str.length; i++) {
            sum[i]=Integer.parseInt(str[i]);//将字符串的每个元素转换到整形数组的每个元素
        }
        int n = str.length/2;//字符长度的一半即是n

        Println(PaiXu(sum, n));//调用打印方法、排序方法

    }
    public static int[] PaiXu(int[] num,int n){
        int[] sum = new int[2*n];
        int a = 0;
        for (int i = 0; a < n; i++) {//num数组的前n个数,放入sum数组的偶数位
            if(i%2==0){
                sum[i]=num[a++];
            }
        }
        int b = 0;
        for (int i = 0; b < n; i++) {//num数组的后n个数,放入sum数组的偶数位
            if(i%2==1){
                sum[i]=num[n+b++];
            }
        }
        return sum;
    }

    public static void Println(int[] sum){//打印新生成的数组
        System.out.print("[");
        for (int i = 0; i < sum.length; i++) {
            System.out.print(sum[i]+",");
        }
        System.out.print("]");
    }
}

2.第二遍

public static int[] PaiXu(int[] num,int n){//其他部分的代码与第一遍是一样的,不再写了
        int[] sum = new int[2*n];//定义一个新数组,长度为2n
        for (int i = 0; i < n; i++) {
            sum[i*2] = num[i];//num的前n个数,依次放入sum的偶数位
            sum[i*2+1] = num[n+i];//num的后n个数,依次放入sum的奇数位
        }
        return sum;
    }

 

总结

今天只写两遍,因为看了其他的代码,也没有更简单的了,再简单就是python什么的,我只写Java。

拥有一个清晰的头脑很重要,最开始自己在纸上演算,非要不建立新数组,最后把自己干懵逼。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值