首页 > 试题广场 >

合并数组

[编程题]合并数组
  • 热度指数:15776 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
请实现一个函数,功能为合并两个升序数组为一个升序数组

输入的格式是用逗号隔开的数字。

数据范围:输入的字符串长度满足

输入描述:
输入有多个测试用例,每个测试用例有1-2行,每行都是以英文逗号分隔从小到大排列的数字


输出描述:
输出一行以英文逗号分隔从小到大排列的数组
示例1

输入

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

输出

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

备注:
不允许使用原生的 sort、concat 等函数
import java.util.*;
public class Main{
    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        String s1 = in.nextLine();
        if (!in.hasNext()) {
            System.out.println(s1);
            return;
        }
        String s2 = in.nextLine(); 
        String[] ss1 = s1.split(",");
        String[] ss2 = s2.split(",");
        int[] a = new int[ss1.length];
        int[] b = new int[ss2.length];
        for(int i = 0; i < ss1.length; i++) {
            a[i] = Integer.valueOf(ss1[i]);
        }
        for(int i = 0; i < ss2.length; i++) {
            b[i] = Integer.valueOf(ss2[i]);
        }
        int[] res = new Solution().merge(a,b);
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < res.length; i++) {
            sb.append(res[i]);
            if(i < res.length - 1) sb.append(",");
        }
        System.out.println(sb.toString());
        
    }
   
}
class Solution{
    public int[] merge(int[] a, int[] b) {
        int[] res = new int[a.length + b.length];
        int j = 0;
        for(int i = 0; i < a.length; i++) {
            res[j] = a[i];
            j++;
        }
        for(int i = 0; i < b.length; i++) {
            res[j] = b[i];
            j++;
        }
        quickSort(res, 0, res.length - 1);
        return res;
    }
    private static void quickSort(int[] a, int left, int right) {
        int l = left, r = right;
        if (l < r) {
            int key = a[left];
            while (l < r) {
                while (l < r && a[r] >= key) r--;
                if (l < r) a[l++] = a[r];
                while (l < r && a[l] < key) l++;
                if (l < r) a[r--] = a[l];
            }
            a[l] = key;
            quickSort(a, left + 1, right);
            quickSort(a, left, right - 1);
        }
    }
}

发表于 2021-06-01 15:13:28 回复(0)
其实就是合并两个有序数组,这种写法可以合并多行
import java.util.Scanner;

/**
 * @Date: 2020-04-29 22:25
 * @version: 1.0
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String strs1[] = sc.nextLine().split(",");
        int arr1[] = new int[strs1.length];
        for (int i = 0;i<arr1.length;i++)
            arr1[i] = Integer.valueOf(strs1[i]);
        while (sc.hasNextLine()){
            String strs2[] = sc.nextLine().split(",");
            int arr2[] = new int[strs2.length];
            for (int j = 0;j<strs2.length;j++)
                arr2[j] = Integer.valueOf(strs2[j]);
            arr1 = merge(arr1,arr2);
        }
        for (int i=0;i<arr1.length-1;i++)
            System.out.print(arr1[i]+",");
        System.out.print(arr1[arr1.length-1]);
        sc.close();
    }

    private static int[] merge(int[] arr1, int[] arr2) {
        int arr[] = new int[arr1.length+arr2.length];
        int index = 0;
        int index1=0;
        int index2=0;
        while (index1<arr1.length&&index2<arr2.length){
            if (arr1[index1]<=arr2[index2])
                arr[index++]=arr1[index1++];
            else
                arr[index++]=arr2[index2++];
        }
        while (index1<arr1.length)
            arr[index++]=arr1[index1++];
        while (index2<arr2.length)
            arr[index++]=arr2[index2++];
        return arr;
    }
}

发表于 2020-04-29 22:58:58 回复(0)
import java.util.*;
public class Main{ 
 
	public static void main(String[] args) { 
      	Scanner in = new Scanner(System.in);
		String s1 = in.nextLine();
		if (!in.hasNext()) {
			System.out.println(s1);
			return;
		}
		String s2 = in.nextLine();
		String[] str1 = s1.split(",");
		String[] str2 = s2.split(","); 
		int[] arrayA = new int[str1.length];
		int[] arrayB = new int[str2.length];
		for (int i = 0; i < str1.length; i++) {
			arrayA[i] = Integer.parseInt(str1[i]);
		}
		for (int i = 0; i < str2.length; i++) {
			arrayB[i] = Integer.parseInt(str2[i]);
		} 
		int[] result = Main.merge(arrayA, arrayB);
        for(int i = 0 ;i < result.length; i++){ 
         System.out.print(result[i]+(i == result.length - 1 ? "" : ","));
         } 
    }
	public static int[] merge(int[] a, int[] b) {
		return mergeIndex(a, b, 0, new int[a.length + b.length]);
	}
       // 递归合并数组
	public static int[] mergeIndex(int[] a, int[] b, int index, int[] result) {
		if (index >= result.length) {
			return mergeSort(result);
		}
		result[index] = index < a.length ? a[index] : b[index - a.length];
		return mergeIndex(a, b, index + 1, result);
	}  // 递归排序
	public static int[] mergeSort(int[] res) {
		return mergeSort(0, 0, res.length + 1, res);
	}

	public static int[] mergeSort(int x, int y, int index, int[] res) {
		if (index < res.length * res.length + res.length) {
			if (res[y] > res[x]) {
				res[x] = res[x] ^ res[y];
				res[y] = res[x] ^ res[y];
				res[x] = res[x] ^ res[y];
			}
			return mergeSort(x = index % res.length == 0 ? ++x : x, index % res.length, index + 1, res);
		}
		return res;
	}
}
发表于 2020-01-13 20:11:37 回复(0)

为什么我这样会一直卡80过不了呢??头疼


import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {        
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
            
            String temp = sc.nextLine();
            String str = sc.nextLine();
            if(str.equals("") || temp.equals("")) {
                System.out.println(str.equals("")?temp:str);
                continue;
            }
            
            String aString[] = temp.split("\\,");
            int a[] = new int[aString.length + 3];
            
            for(int i = 0; i < aString.length ; i++) {
                a[i] = Integer.parseInt(aString[i]);
            }
        
        
            
            
            String aString2[] = str.split("\\,");
            int b[] = new int[aString2.length + 3];
            
            for(int i = 0; i < aString2.length ; i++) {
                b[i] = Integer.parseInt(aString2[i]);
            }
        
            
            int i=0,j=0,k=0;
            int result[] = new int[aString.length + aString2.length + 10];
            
            while(i < aString.length && j < aString2.length) {
                result[k++] = a[i]<b[j] ? a[i++]:b[j++];
            }
            
            while(i < aString.length) {
                result[k++] = a[i++];
            }
            
            while(j < aString2.length) {
                result[k++] = b[j++];
            }
            
            for( int z = 0 ; z < aString.length + aString2.length ; z++ ) {
                if(z != aString.length + aString2.length - 1) {
                    System.out.print(result[z] + ",");
                }else {
                    System.out.println(result[z]);
                }
                
            }
        }
    }
}

发表于 2019-09-09 23:44:13 回复(1)
为什么总是百分之八十 求大佬指点
import java.util.Scanner;
import java.util.TreeSet;
public class Main {
    public static void main(String args[])
    {
        TreeSet<Integer> treeSet = new TreeSet();
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.nextLine();
        String str2 = scanner.nextLine();
        if(str2==null)
        {
            System.out.print(str1);
            return;
        }else {
            String c[] =str1.split(",");
            String c1[]=str2.split(",");
            Integer a1[] =new Integer[c.length];
            Integer a2[] =new Integer[c1.length];
            for(int i=0;i<c.length;i++)
            {
            a1[i]=Integer.valueOf(c[i]);
            treeSet.add(Integer.valueOf(c[i]));
            }
            for(int j=0;j<c1.length;j++)
            {
                a2[j]=Integer.valueOf(c1[j]);
                treeSet.add(Integer.valueOf(c1[j]));
            }
             StringBuilder sb =new StringBuilder();
          for(Integer r:treeSet)
          {
            sb.append(r+",");
          }
        //System.out.print(sb.substring(0,sb.length()-1).toString());
        sb.deleteCharAt(sb.length()-1);
        System.out.print(sb.toString());
        }            
    }
}


发表于 2019-08-28 16:37:43 回复(0)
期望输出和我的实际输出是一模一样啊,为什么自测不通过???????
发表于 2019-07-13 10:32:28 回复(2)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.next();
        if (!scanner.hasNext()) {
            System.out.println(str1);
            return;
        }
        int[] num1 = strToIntArr(str1);
        int[] num2 = strToIntArr(scanner.next());
        int[] num = new int[num1.length + num2.length];
        int index1 = 0, index2 = 0, index = 0;
        while (index1 < num1.length && index2 < num2.length) {
            num[index++] = (num1[index1] <= num2[index2]) ? num1[index1++] : num2[index2++];
        }
        while (index1 < num1.length) {
            num[index++] = num1[index1++];
        }
        while (index2 < num2.length) {
            num[index++] = num2[index2++];
        }
        for (int i = 0; i < num.length; i++) {
            if (i == num.length - 1) {
                System.out.println(num[i]);
            } else {
                System.out.print(num[i] + ",");
            }
        }
    }

    public static int[] strToIntArr(String str) {
        String[] strNumber = str.split(",");
        int[] number = new int[strNumber.length];
        for (int i = 0; i < strNumber.length; i++) {
            number[i] = Integer.parseInt(strNumber[i]);
        }
        return number;
    }
}
编辑于 2019-07-02 11:00:34 回复(0)