题目名称
TwoToOne
题目
Take 2 strings s1
and s2
including only letters from a
to 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类,这个类支持了后续的所有的过滤变换操作。