Codewars Java练习:Two to One

题目名称

TwoToOne

题目

Take 2 strings s1 and s2 including only letters from ato z. Return a new sorted string, the longest possible, containing distinct letters,

  • each taken only once – coming from s1 or s2.

Examples:

a = “xyaabbbccccdefww” b = “xxxxyyyyabklmopq”

longest(a, b) -> “abcdefklmopqwxy”

a = “abcdefghijklmnopqrstuvwxyz”

longest(a, a) -> “abcdefghijklmnopqrstuvwxyz”

题目大意

给定两个字符串,将其加起来,去重,排序后输出。

题解

刻意练习了一下ArrayList类似的容器的使用方式,发现这类问题通常有两个核心要点——

  • 如何将原始元素类型转化为对象形式,比如本题中如何将char数组和Character数组相互转换——
    • 事实上,这个转换在后期的Java版本中有ArrayUtils类提供转换函数
    • 而在早起的版本中,只有通过for语句逐个元素构造
  • 如何在内置数组、ArrayList之间转化
  • 如何在可重ArrayList和不可重的HashSet之间转化。
import java.util.*;
import java.io.*;
class TwoToOne {
	public static String longest(String s1,String s2) {
		char[] arr = (s1+s2).toCharArray();
		Character[] arr_obj = new Character[arr.length];
		for (int i=0;i<arr.length;i++)
			arr_obj[i] = new Character(arr[i]);
		HashSet<Character> dist_set = new HashSet<Character>(new ArrayList<Character>(Arrays.asList(arr_obj)));
		ArrayList<Character> dist_arr = new ArrayList<Character>();
		dist_arr.clear();
		dist_arr.addAll(dist_set);
		Collections.sort(dist_arr);
		String result = new String();
		for (Character w:dist_arr)
			result += w;
		return result;
	}
};

class Main {
	public static void main(String[] args) {
		Scanner fin = new Scanner(System.in);
		String a,b;
		a = fin.next();
		b = fin.next();
		System.out.println(TwoToOne.longest(a,b));
	}
};

标准答案

最后欣赏一下标准答案——

public class TwoToOne {
    
    public static String longest (String s1, String s2) {
        String s = s1 + s2;
        return s.chars().distinct().sorted().collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString();
    }
}

代码使用了String的chars()函数,返回了一个IntStream类,这个类支持了后续的所有的过滤变换操作。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据