华为实习生面试题-字符串输出调整 Java实现
师兄参加了华为的实习生招聘,我也蹭了一下热闹。
题目描述
给你一个原始字符串,根据该字符串内每个字符出现的次数,按照ASCII码递增顺序重新调整输出。
举例!假设原始字符串为:
eeefgghhh
则每种字符出现的次数分别是:
序号 | 字符串 | 次数 |
---|---|---|
(1) | eee | 3次 |
(2) | f | 1次 |
(3) | gg | 2次 |
(4) | hhh | 3次 |
重排输出后的字符串如下:
efghegheh
编写程序,实现上诉功能。
【温馨提示】
(1).原始字符串中仅可能出现“数字”和“字母”
(2).请注意区分字母大小写
输入描述
eeefgghhh
输出描述
efghegheh
题目分析
题目的要求其实十分简单,一是按ASCII码递增排序,二是按字符出现次数重排。
第一个需求十分简单,我这里就直接用Arrays的sort()方法来做了。当然自己写一个排序也不是什么大问题,就是用char的值进行比较而已。
第二个需求也不难,就是不好读懂。按测试用例来图解一遍吧。
如果把输入的字符串放到数组中,左侧红色框相加就是输入eefgghhh(已排序过的输入),左侧蓝色框相加就是输出efgheghh。这么一看就比较直观了,大概就是做一个转置运算,具体怎么做就是各显神通了。
题目解答
Java实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 变量定义
List<String> rec = new ArrayList<String>();
String c2 = "";
int count = 0;
String output = "";
// 打开输入流
Scanner scanner = new Scanner(System.in);
// 按ASCII码排序
char[] ch = scanner.next().toCharArray();
Arrays.sort(ch);
String in = new String(ch);
// 对字符串中的字符逐个处理
for (int i = 0; i < in.length(); i++) {
// 获取当前位置字符
String c1 = in.substring(i, i + 1);
// 与上一个字符对比
if (c1.equals(c2)) {
// 如果和上一个字符相同,向下一行插入
count++;
if (rec.size() < count + 1) {
// 该字符各个多于现有行数,创建新行
rec.add(c1);
} else {
// 该字符各个不多于现有行数,添加到指定行
rec.set(count, rec.get(count) + c1);
}
} else {
// 如果和上一个字符不同,放到第一行
count = 0;
if (rec.size() == 0) {
// 没有第一行时,创建第一行
rec.add(c1);
} else {
// 有第一行时,添加到第一行
rec.set(count, rec.get(count) + c1);
}
}
// 把本次的字符保存到c2中,用于下一次判断
c2 = c1;
}
// 把各行叠加,获得输出
for (String out : rec) {
output += out;
}
// 去除多余空格并输出
System.out.println(output.replaceAll(" ", "").trim());
// 关闭输入流
scanner.close();
}
}
测试用例
输入 | 输出 |
---|---|
eeefgghhh | efghegheh |
fhhheegg | efgheghh |
AABBBCC12367a | 12367ABCaABCB |