题目描述
设有两个字符串,先需要将两个字符串合并,合并要求如下:
(1)合并后的字符串中包含两个字符串出现过的所有字符
(2)若有重复字符则只保留一个
(3)结果字符串按26个字母顺序排列
如字符串str1为"asdfsfcv" 和 字符串2为 “bgfdAdac”
则输出结果为 “Aabcdfgsv”
算法来源:某公司校招笔试题
算法分析
这里可以用桶排序的思想,遍历字符串,将不同的字符放入不同的“桶”中,得到计数数组。根据计数数组是否有值,倒出一个加入结果字符串。
Java代码
public static String mergeStr(String str1 , String str2){
//声明计数数组 count1计算大写字母出现次数,count2计算小写字符出现次数
int[] count1 = new int[26];
int[] count2 = new int[26];
//计算str1,str2中个字符出现次数
for (int i = 0; i < str1.length(); i++){
char c = str1.charAt(i);
if(c >= 'A' && c <= 'Z'){ //大写字母
count1[(int)c - 'A'] ++;
}else if( c>='a'&& c <= 'z' ){ //小写字母
count2[(int)c - 'a'] ++;
}
}
for (int i = 0; i < str2.length(); i++){
char c = str2.charAt(i);
if(c >= 'A' && c <= 'Z'){
count1[(int)c - 'A'] ++;
}else if( c>='a'&& c <= 'z' ){
count2[(int)c - 'a'] ++;
}
}
//通过计数数组得到结果字符串
StringBuffer sb = new StringBuffer();
for (int i = 0 ; i < count1.length ; i++){
if(count1[i] > 0)
sb.append( (char)(i + 'A'));
if (count2[i] > 0)
sb.append( (char)(i + 'a'));
}
return sb.toString();
}
测试
public static void main(String[] args) {
String str1 = "asdfsfcv";
String str2 = "bgfdAdac";
System.out.println(mergeStr(str1,str2));
}
运行结果:
Aabcdfgsv