本人西电大四学生一枚,最近在做华为的上机练习题,知道写得不是很好,于是贴出来望大家指正一下。
题目来自于http://blog.youkuaiyun.com/column/details/huaweicode.html?&page=4,原文均是用的c++,我用的java写的。
题目描述
实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
题目类别: 字符串
难度: 中级
运行时间限制: 10Sec
内存限制: 128MByte
阶段: 入职前练习
输入:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出:
删除字符串中出现次数最少的字符后的字符串。
样例输入:
abcdd
样例输出:
dd
public class num4 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
System.out.println(deleteMinChar(s));
}
private static String deleteMinChar(String s) {
int length = s.length();
char c[] = s.toCharArray();
HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
//先使用hashmap来统计每个字符的出现次数
for (int i = 0; i < length; i++) {
if (hm.get(c[i]) == null)
hm.put(c[i], 1);
else {
int tem = 1 + hm.get(c[i]);
hm.put(c[i], tem);
}
}
int min = 65535;
//找出字符最小出现次数
for (int i = 0; i < length; i++) {
if (hm.get(c[i]) < min)
min = hm.get(c[i]);
}
char cc[] = new char[length];
int index = 0;
//删除出现次数最少的字符
for (int i = 0; i < length; i++) {
if (hm.get(c[i]) > min) {
cc[index] = c[i];
index++;
}
}
return new String(cc).trim();
}
}