zoukankan      html  css  js  c++  java
  • 删除字符串中出现次数最少的字符

    题目描述

    实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。

    输入描述:

    字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。

    输出描述:

    删除字符串中出现次数最少的字符后的字符串。

    输入例子:
    abcdd
    输出例子:
    dd


    思路:(我的思路有点绕弯,先记录下来,后面有网友简洁思路),首先把字符串元素存入list中,继续以key-字符,value-出现次数存入map中,然后map按照value自然升序排序,然后取出map中value最小的对应的key放入另外一list中,则存储原始字母的list删去对应小的map中的key(已存在另一list),OK
     1 import java.util.ArrayList;
     2 import java.util.Collections;
     3 import java.util.Comparator;
     4 import java.util.HashMap;
     5 import java.util.List;
     6 import java.util.Map;
     7 import java.util.Map.Entry;
     8 import java.util.Scanner;
     9 
    10 public class DelStr {
    11 
    12     public static void main(String[] args) {
    13         Scanner sc = new Scanner(System.in);
    14         while (sc.hasNextLine()) {
    15             String s = sc.nextLine();
    16             newStr(s);
    17         }
    18     }
    19 
    20     public static void newStr(String s) {
    21         Map<String, Integer> map = new HashMap<String, Integer>();//key-字符,value-字符出现次数
    22         List<String> li1 = new ArrayList<String>();//用来存储出现次数最少的元素
    23         
    24         List<String> li2 = new ArrayList<String>();//用来存储原始字符串
    25         for (int i = 0; i < s.length(); i++) {
    26             li2.add(String.valueOf(s.charAt(i)));
    27         }
    28         
    29         for (int i = 0; i < s.length(); i++) {//把字符串存储map中,根据value用来寻找出现次数最少的字符
    30             String key = String.valueOf(s.charAt(i));
    31             if (!map.containsKey(key)) {
    32                 map.put(key, 1);
    33             } else {
    34                 map.put(key, map.get(key) + 1);
    35             }
    36         }
    37         
    38         List<Map.Entry<String, Integer>> li = new ArrayList<Map.Entry<String, Integer>>(//把map.entrySet()准换为list元素
    39                 map.entrySet());
    40         
    41         Collections.sort(li, new Comparator<Map.Entry<String, Integer>>() {//使用Collections工具类对list中的Map.Entry<String, Integer>类型元素进行value值升序排序
    42             @Override
    43             public int compare(Entry<String, Integer> o1,
    44                     Entry<String, Integer> o2) {
    45                 if (o1.getValue() < o2.getValue()) {
    46                     return -1;
    47                 } else if (o1.getValue() > o2.getValue()) {
    48                     return 1;
    49                 }
    50                 return 0;
    51             }
    52 
    53         });
    54         
    55         int flag = 0;//记录出现次数最少的元素个数
    56         for (int i = 0; i < li.size() - 1; i++) {
    57             int tem1 = li.get(i).getValue(), tem2 = li.get(i + 1).getValue();
    58             if (tem1 != tem2) {
    59                 break;
    60             } else {
    61                 flag += 1;
    62             }
    63         }
    64         
    65         for (int i = 0; i <= flag; i++) {//把出现次数最少的元素存储到li链表中
    66             String s1 = li.get(i).getKey();
    67             li1.add(s1);
    68         }
    69 
    70         li2.removeAll(li1);//原始数据中移除出现次数最少的元素
    71         
    72         for (int i = 0; i < li2.size(); i++) {//输出更新后的元素
    73             System.out.print(li2.get(i));
    74         }
    75         System.out.print("
    ");
    76     }
    77 
    78 }

    实际上我的代码冗余而且多了不必要的步骤;下面是网友代码:

    
    
     1 import java.util.*;
     2 public class Main{
     3     public static void main(String [] args){
     4         Scanner in = new Scanner(System.in);
     5         String str = "";
     6         HashMap<Character,Integer> map;
     7         while(in.hasNext()){
     8             str = in.nextLine();
     9             StringBuffer sb = new StringBuffer();
    10             map = new HashMap<Character,Integer>();
    11             int Min = Integer.MAX_VALUE;
    12             for(int i = 0;i<str.length();i++){
    13                 char ch = str.charAt(i);
    14                 if(map.containsKey(ch)){
    15                     map.put(ch,map.get(ch) + 1);
    16                 }else{
    17                     map.put(ch,1);
    18                 }
    19             }
    20             for( Integer value :map.values()){
    21                 Min = Math.min(value,Min);
    22             }
    23             for(int i=0;i<str.length();i++){
    24                 char ch = str.charAt(i);
    25                 if(map.get(ch) != Min){
    26                     sb.append(ch);
    27                 }
    28             }
    29             System.out.println(sb.toString());
    30         }
    31     }
    32 }
    
    

    再贴一个

     1 import java.util.HashMap;
     2 import java.util.HashSet;
     3 import java.util.Scanner;
     4  
     5 public class Main {
     6     public static void main(String[] args) {
     7         Scanner console = new Scanner(System.in);
     8         HashMap<Character, Integer> map = new HashMap<>();
     9         HashSet<Character> charSet = new HashSet<>();
    10         char[] charArr;
    11         while (console.hasNext()) {
    12             String inputStr = console.next();
    13             charArr = inputStr.toCharArray();
    14             for (int i = 0; i < charArr.length; i++) {
    15                 charSet.add(charArr[i]);
    16             }
    17             for (char ch : charSet) {
    18                 int temp = 0;
    19                 for (int i = 0; i < charArr.length; i++) {
    20                     if (ch == charArr[i]) {
    21                         temp++;
    22                     }
    23                 }
    24                 map.put(ch, temp);
    25             }
    26             int min = Integer.MAX_VALUE;
    27             for(char ch : map.keySet()){
    28                 int value = map.get(ch);
    29                 if(value < min){
    30                     min = value;
    31                 }
    32             }
    33             StringBuilder result = new StringBuilder();
    34             for (int i = 0; i < charArr.length; i++) {
    35                 if (map.get(charArr[i]) != min)
    36                     result.append(charArr[i]);
    37                 else
    38                     continue;
    39             }
    40             System.out.println(result);
    41         }
    42         console.close();
    43     }
    44 }


  • 相关阅读:
    [你必须知道的异步编程]C# 5.0 新特性——Async和Await使异步编程更简单
    [C# 开发技巧系列]使用C#操作Word和Excel程序
    全面解析C#中参数传递
    VSTO之旅系列(四):创建Word解决方案
    [C# 开发技巧系列] 使用C#操作幻灯片
    VSTO之旅系列(五):创建Outlook解决方案
    [C# 开发技巧系列]C#如何实现图片查看器
    [你必须知道的异步编程]——异步编程模型(APM)
    [你必须知道的异步编程]——基于任务的异步模式
    [C# 开发技巧系列]如何动态设置屏幕分辨率
  • 原文地址:https://www.cnblogs.com/crazybuddy/p/5361595.html
Copyright © 2011-2022 走看看