描述
实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
输入:
字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
输出:
删除字符串中出现次数最少的字符后的字符串。
样例输入:
abcdd
样例输出:
dd
解法
该题考查对字符串的操作。
- 对字符串的字符进行遍历;
- 遍历时统计每个字符的出现的次数,可以用哈希存储;
- 最小次数的字符用链表存储
- 非最小次数的字符进行输出。
/*
* Copyright (c) waylau.com, 2022. All rights reserved.
*/
package com.waylau.nowcoder.exam.oj.huawei;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
/**
* HJ23 删除字符串中出现次数最少的字符.
* 描述:实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。
* 输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
* 输入: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。
* 输出: 删除字符串中出现次数最少的字符后的字符串。
*
* @author <a href="https://waylau.com">Way Lau</a>
* @since 2022-08-15
*/
public class HJ023DeleteLeastOccurringCharacterFromString {
public static void main(String[] args) {
// 输入
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String in = sc.nextLine();
int len = in.length();
// 遍历时统计每个字符的出现的次数,可以用哈希存储。
Map<Character, Integer> map = new HashMap<>(len);
for (int i = 0; i < len; i++) {
char ch = in.charAt(i);
Integer count = map.get(ch);
if (count == null) {
count = 1;
} else {
count++;
}
map.put(ch, count);
}
// 最小数量的字符用链表存储;
List<Character> minList = new ArrayList<>(len);
int min = Integer.MAX_VALUE;
for (Entry<Character, Integer> entry : map.entrySet()) {
char ch = entry.getKey();
int count = entry.getValue();
if (count < min) {
min = count;
// 清空非最小值
minList.clear();
minList.add(ch);
} else if (count == min) {
minList.add(ch);
} else {
// 什么都不做
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
char ch = in.charAt(i);
// 不是最小,就输出
if (!minList.contains(ch)) {
sb.append(ch);
}
}
// 输出
System.out.println(sb.toString());
}
// 关闭
sc.close();
}
}
参考引用
- 本系列归档至https://github.com/waylau/nowcoder-exam-oj
- 《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action
- 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):https://item.jd.com/13014179.html

京公网安备 11010502036488号