首页 > 试题广场 >

字符统计

[编程题]字符统计
  • 热度指数:201846 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。

数据范围:字符串长度满足


输入描述:

一个只包含小写英文字母和数字的字符串。



输出描述:

一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。

示例1

输入

aaddccdc

输出

cda

说明

样例里,c和d出现3次,a出现2次,但c的ASCII码比d小,所以先输出c,再输出d,最后输出a.
     
import java.util.Scanner;
import java.util.TreeMap;
import java.util.Arrays;
import java.util.Map;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        //1.TreeMap获取字符及数量,默认按字符升序排列
        TreeMap<Character, Integer> tm = new TreeMap();
        for (int i = 0; i < s.length(); i++) {
            if (tm.containsKey(s.charAt(i))) {
                int count = tm.get(s.charAt(i));
                tm.put(s.charAt(i), ++count);
            } else {
                tm.put(s.charAt(i), 1);
            }
        }
        //2.每次取出第一个出现次数最大值字符,拼接到sb中
        StringBuilder sb = new StringBuilder("");
        //Arrays.sort方法也可以实现,但是编译器不支持自定义排序函数使用
        while (!tm.isEmpty()) {
            int max = getMax(tm);
            for(Map.Entry<Character, Integer> entry :tm.entrySet()){
                if(entry.getValue()==max){
                    char c=entry.getKey();
                    sb.append(c);
                    //遍历过该字符,删除
                    tm.remove(c);
                    break;
                }
            }
        }
        System.out.print(sb.toString());

    }
    public static int getMax(TreeMap<Character, Integer> tm) {
        int max = 0;
        for (int num : tm.values()) {
            if (num > max) {
                max=num;
            }
        }
        return max;
    }
}

发表于 2024-03-28 15:33:58 回复(0)
我是使用其他class来辅助的


import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    public static void solution(String inputStr) {
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String inputStr = in.nextLine();
            Map<Character, Integer> charNumMap = new HashMap<>();
            for(int i = 0; i < inputStr.length(); i ++) {
                char curChar = inputStr.charAt(i);
                if(charNumMap.containsKey(curChar)) {
                    charNumMap.put(curChar, charNumMap.get(curChar) + 1);
                } else {
                    charNumMap.put(curChar, 1);
                }
            }
             Set<Node> nodeSet = new TreeSet<>();
            for(Map.Entry<Character, Integer> entry : charNumMap.entrySet()) {
                Character key = entry.getKey();
                Integer value = entry.getValue();
                nodeSet.add(new Node(key, value));
            }
            for(Node item : nodeSet) {
                //System.out.println(item.getElement() + " : " + item.getNumber());
                System.out.print(item.getElement());
            }
        }
    }  
}

class Node implements Comparable {

           private char element;
           private int number;
           
            public Node(char element, int number) {
                this.element = element;
                this.number = number;
            }

           public char getElement() {
                return this.element;
           }
           public int getNumber() {
                return this.number;
           }

        //    @Override
        //    public int hashCode() {
        //         return 11111;
        //    }

        //    @Override
        //    public boolean equals(Object obj) {
        //        Node inputN = (Node)obj;
        //        if(this.getElement() == inputN.getElement() ) {
        //            return true;
        //        }
        //        return false;
        //    }

           @Override
           public int compareTo(Object n) {
                Node inputN = (Node)n;
                if(this.getNumber() > inputN.getNumber()) {
                    return -1;
                } else if(this.getNumber() == inputN.getNumber()) {
                    if(this.getElement() > inputN.getElement()) {
                        return 1;
                    } else if(this.getElement() == inputN.getElement()) {
                        return 0;
                    } else {
                        return -1;
                    }
                } else {
                    return 1;
                }
           }
    }





编辑于 2024-01-17 14:21:21 回复(0)
尽量用流式处理和lambda提高可读性
import java.util.*;
import java.util.stream.Collectors;


// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String str = in.nextLine();
        char[] arr = str.toCharArray();
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        for (char c : arr) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        List<Map.Entry<Character, Integer>> entryList = map.entrySet().stream()
                .sorted((o1, o2) -> Character.compare(o1.getKey(), o2.getKey()))
                .sorted((o1, o2) -> Integer.compare(o2.getValue(), o1.getValue()))
                .collect(Collectors.toList());
        entryList.forEach(entry -> System.out.print(entry.getKey()));
    }
}


编辑于 2024-01-01 11:28:26 回复(0)
import java.util.*;


// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class emptyBowl {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        char[] array = s.toCharArray();
        int[] a = new int[128];
        for (char c : array) {
            a[(int) c]++;
        }
        int max = s.length();
        while (max > 0) {
            for (int i = 0; i < a.length; i++) {
                if (a[i] == max) {
                    System.out.print((char) i);
                }
            }
            max--;
        }
    }
}

编辑于 2023-12-07 02:53:39 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        Map<Character, Integer> map = new HashMap();
        for (int i = 0; i < s.length(); i++) {
            map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
        }
        List<Map.Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());
        Collections.sort(list, (o1, o2)-> {
            if (o1.getValue() != o2.getValue()) {
                return o2.getValue() - o1.getValue();
            } else {
                return o1.getKey().compareTo(o2.getKey());
            }
        });
        list.forEach( e -> System.out.print(e.getKey()));
    }
}

发表于 2023-11-28 22:20:34 回复(0)
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();

        // 统计每个字符的次数
        HashMap<Character, Integer> map = new HashMap<>();
        // 遍历
        for (int i = 0; i < line.length(); i++) {
            char c = line.charAt(i);
            map.put(c, map.getOrDefault(c, 0) + 1);
        }

        // 业务场景为按照key排序,并统计次数
        TreeMap<Integer, TreeSet<Character>> treeMap = new TreeMap<>
        (new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                // 按照次数降序
                return o2.compareTo(o1);
            }
        });

        // 放入treeMap中排序,按照次数降序,相同次数的字符,按照升序排序
        for (Map.Entry<Character, Integer> entry : map.entrySet()) {
            Integer value = entry.getValue();
            Character key = entry.getKey();
            TreeSet<Character> characters = treeMap.get(value);

            if (characters == null) {
                TreeSet<Character> treeSet = new TreeSet<>();
                treeSet.add(key);
                treeMap.put(value, treeSet);
            } else {
                characters.add(key);
            }
        }

        // 打印结果
        for (Map.Entry<Integer, TreeSet<Character>> entry : treeMap.entrySet()) {
            Integer key = entry.getKey();
            TreeSet<Character> value = entry.getValue();
            for (Character character : value) {
                System.out.print(character);
            }
        }
    }
}

发表于 2023-08-15 16:47:44 回复(0)
import java.util.HashMap;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String source = sc.nextLine();
        HashMap<Character, Integer> charNum = new HashMap<>();
        for (char c : source.toCharArray()) {
            if (charNum.containsKey(c)) {
                charNum.put(c, charNum.get(c) + 1);
            } else {
                charNum.put(c, 1);
            }
        }
        TreeMap<Integer, TreeSet<Character>> statisticChars = new TreeMap<>((o1, o2) -> o2-o1);
        charNum.forEach((character, num) -> {
            if (statisticChars.containsKey(num)) {
                statisticChars.get(num).add(character);
            } else {
                TreeSet<Character> value = new TreeSet<>();
                value.add(character);
                statisticChars.put(num, value);
            }
        });

        for (TreeSet<Character> value : statisticChars.values()) {
            for (Character character : value) {
                System.out.print(character);
            }
        }
    }
}


发表于 2023-08-10 14:03:58 回复(0)
import java.io.*;

public class Main {
    public static void main(String[] agrs) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while ((str = br.readLine()) != null) {
            int[] arr = new int[128];
            for (int i = 0; i < str.length(); i++) {
                char ch = str.charAt(i);
                // 如果某个字符出现,则将该字符ASCII码值作为下标的数组元素值+1
                arr[(int)ch]++;
            }
            int max = 0;
            // 寻找最大次数
            for (int i = 0; i < arr.length; i++) if (arr[i] > max) max = arr[i];
            StringBuilder sb = new StringBuilder();
            while (max > 0) {
                // 寻找数组中值为max的元素,若找到则将该值对应的下标转换为char类型,然后拼接
                // 因为下标即为ASCII码值,所以可以直接将下标转换为char类型
                // 因为是从i=0的下标开始递增遍历,所以如果对出现次数相同的字符,会按按ASCII码的升序拼接
                for (int i = 0; i < arr.length; i++) if (arr[i] == max) sb.append((char)i);
                max--;
            }
            System.out.println(sb.toString());
        }
    }
}


发表于 2023-07-18 11:49:47 回复(0)
import java.util.Scanner;
import java.util.HashMap;
import java.util.Collections;
import java.util.ArrayList;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String str = sc.nextLine();
            HashMap<Character, Integer> map = new HashMap<>();
            //把 字符-出现次数 放入HashMap中
            for (char ch : str.toCharArray()) {
                map.put(ch, map.getOrDefault(ch, 0) + 1);
            }
            // 再把字符放入ArrayList中,自定义比较器进行sort
            ArrayList<Character> chList = new ArrayList<>(map.keySet());
            Collections.sort(chList, new Comparator<Character>() {
                public int compare(Character c1, Character c2) {
                    int num = map.get(c2)-map.get(c1);
                    int num2 = num==0?c1 - c2:num;
                    return num2;
                }
            });
            //输出排序后的字符
            for (Character ch : chList) {
                System.out.print(ch.toString());
            }
            System.out.println();
        }
        sc.close();
    }
}

发表于 2023-07-02 19:26:15 回复(1)
 public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String a = in.next();
            char[] chars = a.toCharArray();
            TreeMap<Character,Integer> treeMap = new TreeMap<Character,Integer>();
            for(int i=0;i<chars.length;i++){
                char c= chars[i];
                if(treeMap.containsKey(c)){
                    treeMap.put(c,treeMap.get(c)+1);
                }else{
                    treeMap.put(c,1);
                }
            }
            ArrayList<TreeMap<Character,Integer>> list = new ArrayList<TreeMap<Character,Integer>>();
            for(Map.Entry<Character,Integer> entry:treeMap.entrySet()){
                TreeMap<Character,Integer> temp = new TreeMap<Character,Integer>();
                temp.put(entry.getKey(),entry.getValue());
                list.add(temp);
            }
            list.sort(new Comparator<TreeMap<Character,Integer>>(){
                @Override
                public int compare(TreeMap<Character,Integer> o1,TreeMap<Character,Integer> o2){

                    return o2.lastEntry().getValue()-o1.lastEntry().getValue();
                }
            });
            StringBuffer bf = new StringBuffer();
            for(TreeMap<Character,Integer> mm:list){
                bf.append(mm.firstEntry().getKey());
            }
            System.out.println(bf.toString());
        }
    }
发表于 2023-04-16 23:25:43 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        int n = str.length();
        HashMap<Character, Integer> map = new HashMap<>();
        for(int i = 0; i < n; i++){
            Character c = str.charAt(i);
            if(!map.containsKey(c))
                map.put(c, 1);
            else{
                map.put(c, map.get(c) + 1);
            }
        }
        Queue<Map.Entry<Character, Integer>> queue = new PriorityQueue<Map.Entry<Character, Integer>>((a, b) -> {
            if(a.getValue() > b.getValue())
                return -1;
            else if(a.getValue() < b.getValue())
                return 1;
            else if(a.getKey() < b.getKey())
                return -1;
            else
                return 1;
        });
        for(Map.Entry<Character, Integer> entry : map.entrySet()){
            queue.offer(entry);
        }
        StringBuffer buffer = new StringBuffer();
        while(!queue.isEmpty()){
            buffer.append(queue.poll().getKey());
        }
        System.out.println(buffer.toString());
    }
}

发表于 2023-04-06 20:59:36 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String str = in.next();
            //字符串转为字节数组
            char[] strChar = str.toCharArray();
            //int数组,下标用于表示ascll值,值代表出现的个数
            int[] chars = new int[129];
            //遍历字符数组,统计int数组下标代表的字符出现次数
            for (char c : strChar) {
                chars[(int)c]++;
            }
            //代表出现最多的一个字符出现的次数
            int max = 0;
            //遍历int数组出现最多的一个字符出现的次数
            for (int i = 0; i < chars.length; i++) {

                if (chars[i] > max)
                    max = chars[i];
            }
            StringBuilder sb = new StringBuilder();

            while (max != 0) {
                //下标(即ASCII值)从小到大遍历,保证了【如果统计的个数相同,则按照ASCII码由小到大排序输出。】的要求
                for (int i = 0; i < chars.length; i++) {
                    if (chars[i] == max)
                        sb.append((char)i);
                }
                max--;
            }
            System.out.println(sb.toString());
        }
    }
}

发表于 2023-03-17 12:50:04 回复(0)
import java.util.Comparator;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            TreeMap<Character, Integer> map = new TreeMap<>();
            for (char c : in.next().toCharArray()) {
                map.put(c, map.getOrDefault(c, 0) + 1);
            }
            map.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).map(Map.Entry::getKey).forEach(System.out::print);
        }
    }
}

发表于 2023-03-08 17:08:19 回复(1)
import java.util.Scanner;
import java.util.Map;
import java.util.TreeMap;
import java.util.List;
import java.util.ArrayList;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            Map<Character, Integer> dataMap = new TreeMap<>();
            String input = in.nextLine();
            composeMap(input, dataMap);
            getResult(dataMap);
        }
    }

    private static void composeMap(String input,
                                   Map<Character, Integer> data) {
        // ASCII 码值从小到大存入TreeMap
        for (int i = 0; i < input.length(); i++) {
            char ch = input.charAt(i);
            if (data.containsKey(ch)) {
                int v = data.get(ch);
                v = v + 1;
                data.put(ch, v);
            } else {
                data.put(ch, 1);
            }
        }
    }

    private static void getResult(Map<Character, Integer> data) {
        StringBuilder sb = new StringBuilder();
        while (!data.isEmpty()) {
            int max = 0;
            int count = 0;
            // 依次获取最大值,删除
            for (char key : data.keySet()) {
                int value = data.get(key);
                if (value > max) {
                    max = value;
                }
            }
            List<Character> list = new ArrayList<>();
            for (char key : data.keySet()) {
                if (max == data.get(key)) {
                    list.add(key);
                }

            }
            //放入列表中删除
            for (int i = 0; i < list.size(); i++) {
                char cha = list.get(i);
                sb.append(cha);
                data.remove(cha);
            }
        }
        System.out.println(sb.toString());
    }

}

发表于 2022-12-09 21:17:51 回复(0)
import java.util.Scanner;
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String str = in.next();
            TreeMap<Character, Integer> map = new TreeMap<>();
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                if (map.containsKey(c)) {
                    int count = map.get(c);
                    map.put(c, ++count);
                } else {
                    map.put(c, 1);
                }
            }
            int maxCount = 0;
            Set<Character> set = map.keySet();
            for (Character c : set) {
                int count = map.get(c);
                if (count > maxCount) {
                    maxCount = count;
                }
            }
            while (maxCount > 0) {
                for (Character c : set) {
                    int count = map.get(c);
                    if (count == maxCount) {
                        System.out.print(c);
                    }
                }
                maxCount--;
            }
            System.out.println();

        }
    }
}

发表于 2022-11-06 09:33:31 回复(0)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String string = sc.nextLine();
            HashMap<Character, Integer> hashMap = new HashMap<>();
            for (char ch : string.toCharArray()) {
                if (hashMap.containsKey(ch)) {
                    hashMap.put(ch, hashMap.get(ch) + 1);
                } else {
                    hashMap.put(ch, 1);
                }
            }
            Set<Map.Entry<Character, Integer>> entrySet = hashMap.entrySet();
            ArrayList<Map.Entry<Character, Integer>> list = new ArrayList<>(entrySet);
            Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
                @Override
                public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
                    if (o1.getValue() == o2.getValue()) {
                        return o1.getKey() - o2.getKey();
                    } else {
                        return o2.getValue() - o1.getValue();
                    }
                }
            });
            for (Map.Entry<Character, Integer> entry : list) {
                System.out.print(entry.getKey());
            }
            System.out.println();
        }
    }
}


发表于 2022-10-30 02:41:54 回复(0)
import java.util.*;

/**
 * 一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。
 * 示例1
 * 输入:
 * aaddccdc
 * 输出:
 * cda
 * 说明:
 * 样例里,c和d出现3次,a出现2次,但c的ASCII码比d小,所以先输出c,再输出d,最后输出a.
 */
public class HJ102_treemap加比较 {
    public static void main(String[] args) {
        TreeMap<Character, Integer> abc=new TreeMap<>();
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
        char c;
        for (int i = 0; i < s.length(); i++) {
            c=s.charAt(i);
            if(!abc.containsKey(c))
                abc.put(c,1);
            else
                abc.put(c,abc.get(c)+1);
        }
        ArrayList<Map.Entry<Character, Integer>> list=new ArrayList<>(abc.entrySet());
        list.sort(new Comparator<Map.Entry<Character, Integer>>() {
            @Override
            public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {//compare方法return负数表示反转,0和正数不变,o2在o1前,故o1-o2从小到大
                if (o2.getValue()-o1.getValue()==0)//值相等比较ASCII码,小的在前
                    return o1.getKey()-o2.getKey();
                else
                    return o2.getValue()-o1.getValue();//value不同,值大的在前
            }
        });
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i).getKey());
        }
    }
}

发表于 2022-08-26 15:38:17 回复(0)