华为笔试题 – 多个数组按顺序合并(JAVA代码实现)

华为笔试题 – 多个数组按顺序合并(JAVA代码实现)

题目描述:

现在有多组整数数组,需要将他们合并成一个新的数组。合并规则,从每个数组里按顺序取出固定长度的内容合并到新的数组中,取完的内容会删除掉,如果该行不足固定长度或者已经为空,则直接取出剩余部分的内容放到新的数组中,继续下一行。如样例1,获得长度3,先遍历第一行,获得2,5,6;再遍历第二行,获得1,7,4;再循环回到第一行,获得7,9,5;再遍历第二行,获得3,4;再回到第一行,获得7,按顺序拼接成最终结果。

输入描述:

第一行是每次读取的固定长度,长度>0;
第2-n行是需要合并的数组,不同的数组用回车换行分隔,数组内部用逗号分隔。

输出描述

输出一个新的数组,用逗号分隔。
------------------------------------------示例-----------------------------------------

输入:

3
2
2,5,6,7,9,5,7
1,7,4,3,4

输出:

2,5,6,1,7,4,4,5,7,7,9,5,3,4,1,3,8,7

示例2
输入
4
3
1,2,3,4,5,6
1,2,3
1,2,3,4
输出
1,2,3,4,1,2,3,1,2,3,4,5,6

解法一:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {

        while(true){
            break;
        }


        Scanner in = new Scanner(System.in);
        int c = Integer.parseInt(in.nextLine());
        int n = Integer.parseInt(in.nextLine());
        int i = 0;
        String[] str = new String[n];
        while (i < n) {
            str[i] = in.nextLine();
            i++;
        }
        Integer[][] nums = new Integer[n][100];
        Integer[] num = new Integer[n * 100];
        Map<Integer, Integer> map = new HashMap();
        Map<Integer, Integer> ml = new HashMap();
        int m = 0;
        for (int j = 0; j < n; j++) {
            map.put(j, 0);
            String[] cn = str[j].split(",");
            ml.put(j, cn.length - 1);
            for (int k = 0; k < cn.length; k++) {
                nums[j][k] = Integer.parseInt(cn[k]);
            }
        }

        int flag = 0;
        while (true) {

            for (int j = 0; j < n; j++) {
                int s = 0;
                if (ml.get(j) - map.get(j) + 1 >= c) {
                    for (int jj = 0; jj < c; jj++) {
                        num[m++] = nums[j][map.get(j)];
                        map.put(j, map.get(j) + 1);
                    }
                    s=1;
                } else {
                    s=0;
                    s = ml.get(j) - (map.get(j) - 1);
                    for (int jj = 0; jj < s; jj++) {
                        num[m++] = nums[j][map.get(j)];
                        map.put(j, map.get(j) + 1);
                    }
                }
                if(s==0){

                }else{
                    if (map.get(j) - 1 == ml.get(j)) {
                        flag++;
                    }
                }


            }

            if(flag == n){
                break;
            }
        }
        for (int k = 0; k < m; k++) {
            if (k != m - 1) {
                System.out.print(num[k] + ",");
            } else {
                System.out.print(num[k]);
            }
        }
    }
}
解法二:
import java.util.ArrayList;
import java.util.Scanner;

public class biShi {

	public static boolean isNull(ArrayList<String> gh) {
		int i = 0;
		for (i = 0; i < gh.size(); i++) {
			if (gh.get(i) != null)
				break;
		}
		if (i < gh.size()) {
			return false;
		} else {
			return true;
		}
	}

	public static void Alg(ArrayList<String> ma, int num) {
		String tem = "";// 作为最后的返回结果
		while (!isNull(ma)) {
			for (int i = 0; i < ma.size(); i++) {
				String sk = ma.get(i);
				if (sk == null) {
					continue;
				}
				String[] gg = sk.split(",");
				if (sk.length() == 0) {
					ma.set(i, null);// 删掉取完的内容
				} else {
					if (gg.length <= num) {
						tem = tem + sk + ",";
						ma.set(i, null);
					} else {
						for (int k = 0; k < num; k++) {
							tem = tem + gg[k] + ",";
						}
						String hh = "";
						for (int l = num; l < gg.length; l++) {
							if (l == gg.length - 1) {
								hh = hh + gg[l];
							} else {
								hh = hh + gg[l] + ",";
							}
						}
						// 将没取完的数组重新覆盖
						ma.set(i, hh);
					}
				}
			}
		}
		System.out.println(tem.substring(0, tem.length() - 1));
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		ArrayList<String> ma = new ArrayList<String>();
		sc.nextLine();// nextInt()会留下一个回车,需要消除,否则后边会出错
		while (!sc.hasNext("#")) {// 以#结束,这里你可以修改成其他的
			ma.add(sc.nextLine());
		}
		Alg(ma, num);
	}
}


解法三
/**
 * @ClassName Main
 * @Description TODO
 * @Author ylqdh
 * @Date 2020/4/7
 */
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();

        /*
            随着输入增加,要拼接的数组会增多,那么拼接的结果就会变化
            所以我定义了两个list,把所有的输入,存进一个list中; 然后另一个list每次只复制allList的值
            如果只定义一个的话,会把前面的值清空
         */
        List<String> allLine = new ArrayList<>();  // 随着输入增加,把所有的组以String存进list中
        List<String> line = new ArrayList<>();     // 把目前的输入情况放到这个list中

        scan.nextLine();  // 不知道为什么,如果不加这一行,后面的scan.nextLine()就读不到数据,有知道的可以告诉我一下

        while (scan.hasNext()) {
            // 把一行输入存储进All List中
            allLine.add(scan.nextLine());

            // 把当前的所有输入转到line中,随着后面的拼接,line里的内容会清空
            for (int i = 0; i < allLine.size(); i++) {
                line.add(allLine.get(i));
            }

            // 接下来就line里的所有数组进行拼接了;而所有结果都在all list中,不会造成影响

            StringBuilder result = new StringBuilder();
            String tmp;
            int flag = 0;
            int tmpSize = line.size();

            while (flag < tmpSize) {
                for (int j = 0; j < line.size(); j++) {
                    tmp = line.get(j);

                    // list的这个位置已经清空,不需要再进行拼接
                    if (tmp.length() == 0) {
                        flag++;
                        line.remove(j);
                        continue;
                    }

                    // 一行输入,需要以逗号分隔
                    String[] nums = tmp.split(",");

                    // 长度不足n位,则剩下的全部加到结果数组中
                    if (nums.length <= n) {
                        result.append(tmp).append(",");
                        line.set(j,"");
                        continue;
                    }

                    String sc = nums[0]+","+nums[1]+","+nums[2]+",";
                    result.append(sc);  // 有3位,直接把这3位数字拼接到数组末尾
                    line.set(j,tmp.substring(sc.length()));  // 原字符 则 减掉这3位
                }
            }

            // 输出结果,注意要把末尾的逗号去掉
            System.out.println(result.substring(0,result.length()-1));
        
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值