首页 > 其他分享 >HJ102 字符统计

HJ102 字符统计

时间:2023-07-12 17:12:45浏览次数:35  
标签:count 字符 int chars 次数 HJ102 ASCII 统计

1. 题目

读题

HJ102 字符统计

 

 

考查点

 

这道题的考查点可能是以下几个方面:

  • 字符串的处理和操作,如遍历、分割、拼接等。
  • 数据结构的选择和使用,如数组、字典、列表等。
  • 排序算法的理解和实现,如冒泡排序、选择排序、快速排序等。
  • 编程语言的基本语法和规范,如变量、函数、循环、条件判断等。

2. 解法

有两种解法

  • 使用两个数组
  • 使用map 

这道题还有其他解法,比如:

  • 可以用正则表达式来匹配字符串中的数字和字母,然后用Counter类来统计每个字符出现的次数,最后用sorted函数来按照题目要求的排序规则来输出结果。
  • 可以用ord函数和chr函数来将字符转换为ASCII码和反向转换,然后用一个长度为128的数组来存储每个ASCII码对应的字符出现的次数,最后遍历数组,按照题目要求的排序规则来输出结果。

你可以参考以下网址了解更多关于这些解法的代码示例:

解法一:使用两个数组分别存储字符和频率,然后排序,输出 

思路

  • 创建一个长度为36的整型数组,用来存储每个字符出现的次数。数组的前10个元素对应数字0-9,后26个元素对应字母a-z。
  • 读取输入的字符串,遍历每个字符,根据字符的ASCII码值更新对应的数组元素。
  • 创建一个长度为36的字符数组,用来存储每个字符。数组的前10个元素是数字0-9,后26个元素是字母a-z。
  • 对两个数组进行排序,按照字符出现的次数降序排列,如果次数相同,则按照字符的ASCII码升序排列。
  • 遍历排序后的字符数组,如果对应的次数不为0,则输出该字符。

难点

  • 需要处理多组输入,并且每组输入的字符串长度不一定相同,需要用循环和条件判断来控制输入和输出的流程。
  • 需要对字符串中的不同字符进行统计,同时考虑到字符的ASCII码和出现的次数,需要用合适的数据结构来存储和排序这些信息,比如数组、字典、列表等。
  • 需要按照题目要求的排序规则,即按照次数降序,如果次数相同,则按照ASCII码升序,来输出结果,需要用比较函数或者自定义排序方法来实现。

你可以参考以下网址了解更多关于这道题目的解题思路和代码示例:

代码逻辑

 

具体实现

 

public class HJ102 {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(getCharFrequency(sc.nextLine()));
}

public static String getCharFrequency(String str) {
int[] count = new int[36];
char[] chars = new char[36];
int index = 0;
for (char c : str.toCharArray()) {
if (Character.isDigit(c)) {
index = c - '0';
} else {
index = c - 'a' + 10;
}
count[index] += 1;
chars[index] = c;
}

sort(chars, count);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < chars.length; i++) {
if (count[i] > 0) {
sb.append(chars[i]);
}
}
return sb.toString();
}

public static void sort(char[] chars, int[] count) {
int len = chars.length;
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
if (count[i] < count[j] || (count[i] == count[j] && chars[i] > chars[j])) {
swap(chars, count, i, j);
}
}
}
}

public static void swap(char[] chars, int[] count, int i, int j) {
char temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;

int temp2 = count[i];
count[i] = count[j];
count[j] = temp2;
}

}

方法二:使用 map 

解题思路如下:

  • 使用一个循环来处理多组输入,每次读取一行字符串。
  • 使用一个字典(map)来存储每个字符出现的次数,遍历字符串中的每个字符,如果字典中不存在该字符,则将其加入字典并初始化次数为1,否则将其次数加1。
  • 使用一个列表(vector)来存储字典中的键值对,即字符和次数,然后对列表进行排序,排序规则是按照次数降序,如果次数相等,则按照字符的ASCII码升序。
  • 使用一个循环来遍历排序后的列表,输出每个字符。

 

具体实现

import java.util.*;

//定义一个字符统计的类
public class CharCount {
    //定义一个方法,接收一个字符串参数,返回一个排序后的字符列表
    public static List<Map.Entry<Character, Integer>> countChar(String str) {
        //创建一个字典,用来存储每个字符出现的次数
        Map<Character, Integer> map = new HashMap<>();
        //遍历字符串中的每个字符
        for (char c : str.toCharArray()) {
            //如果字典中不存在该字符,就将其加入字典,并初始化次数为1
            if (!map.containsKey(c)) {
                map.put(c, 1);
            } else {
                //否则,将其次数加1
                map.put(c, map.get(c) + 1);
            }
        }
        //创建一个列表,用来存储字典中的键值对
        List<Map.Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());
        //对列表进行排序,按照次数降序,如果次数相等,按照字符的ASCII码升序
        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().equals(o2.getValue())) {
                    return o2.getValue() - o1.getValue();
                } else {
                    //否则,按照字符的ASCII码升序
                    return o1.getKey() - o2.getKey();
                }
            }
        });
        //返回排序后的列表
        return list;
    }

    //定义主方法,用来测试字符统计的方法
    public static void main(String[] args) {
        //创建一个扫描器,用来读取输入
        Scanner sc = new Scanner(System.in);
        //使用一个循环来处理多组输入,每次读取一行字符串
        while (sc.hasNextLine()) {
            String str = sc.nextLine();
            //调用字符统计的方法,得到排序后的字符列表
            List<Map.Entry<Character, Integer>> list = countChar(str);
            //使用一个循环来遍历列表,输出每个字符
            for (Map.Entry<Character, Integer> entry : list) {
                System.out.print(entry.getKey());
            }
            System.out.println(); //换行
        }
        sc.close(); //关闭扫描器
    }
}

 

3. 总结

 

判断字符的ASCII码大小的方法有以下几种:

  • 可以直接用比较运算符(如<, >, ==等)来比较两个字符的ASCII码大小,因为字符在计算机中是用ASCII码的二进制数来表示的,比较运算符会自动将字符转换为对应的数值进行比较。例如,‘a’ > 'A’的结果是true,因为’a’的ASCII码是97,'A’的ASCII码是65,97大于65。
  • 可以用强制类型转换(如(int)等)来将字符转换为整型数值,然后再比较它们的大小。例如,(int)‘a’ > (int)'A’的结果也是true,因为(int)'a’的值是97,(int)'A’的值是65。
  • 可以用isascii()函数来判断一个字符是否是ASCII码,即是否在0到127之间。如果是,返回非零值;如果不是,返回零。这个函数需要引入<ctype.h>头文件。例如,isascii(‘a’)的结果是非零值,isascii(‘中’)的结果是零。

你可以参考以下网址了解更多关于ASCII码和字符比较的知识:

标签:count,字符,int,chars,次数,HJ102,ASCII,统计
From: https://www.cnblogs.com/shoshana-kong/p/17542224.html

相关文章

  • C# 获取字符串自动换行
    ```//判断是否是汉字publicstaticboolIsChinese(charchr){return(int)chr>0x4E00&&(int)chr<0x9FA5;}///<summary>///截取字符串,不限制字符串长度///</summary>///<paramname="str&qu......
  • 统计平台广告推送工具支持百度、51拉、CNZZ 用法详解
    此软件用于伪造站长统计的搜素关键词,可以模拟百度、360、搜狗等搜索引擎来路 支持自定义刷词次数、多线程支持自定义线程数,速度更快 支持指定网址推广,带来更精确的网站IP来路 一键导入几十万个网站,支持TXT文件导入一行一个网址即可 5.8版界面预览: 可以模拟电脑......
  • Java IO:字节流、字符流、缓冲流
    原文:https://blog.csdn.net/mu_wind/article/details/108674284流的特性有下面几点:先进先出:最先写入输出流的数据最先被输入流读取到。顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。(RandomAccessFile除外)只读或只写:......
  • 标准差、方差、偏度、峰度等统计学指标在SPSS中的计算
      本文介绍基于SPSS软件的经典统计学分析与偏度、峰度等常用统计学指标的计算方法。  首先需要说明,本文所述数据的经典统计学分析,包括计算数据的极值、平均值、中位数、标准差、方差、变异系数、偏度与峰度等常用统计学指标。  首先,打开SPSS软件。  第一步需要将数据导......
  • 子查询高级查询以及集合运算统计函数
    子查询单行子查询子查询部分的返回结果为单行的结果多行子查询子查询部分的返回结果为多行的结果,主要关键字有any,in,allany表示任意一个,在集合中有一个满足条件即可all所有,在集合中所有都满足即可in表示任意一个,在集合中有一个满足条件即可eg:s......
  • Go--统计数组中重复的元素及重复次数
    代码:packagemainimport("fmt")funcmain(){//创建有重复数值的数组a1:=[]int{1,2,3,1,4,5,2}a2:=[]string{"t1","t2","t1","t3","t5","t3"}//创建maps1:=......
  • 构造字符串有感
    题目要求用小写字母构造一个字符串,这个字符串最大到1e6,这种题一般有两种思路。思路我们要做的就是,找到规律。打表找规律用dp思想,线性推,考虑当前位置字符只受前面已经出现的字符影响,且无后效性。因为字母只有26个,所以找到状态方程,就可以很好的解决了题目参考cf:https://codef......
  • 【剑指Offer】54、字符流中第一个不重复的字符
    【剑指Offer】54、字符流中第一个不重复的字符题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当......
  • HJ84 统计大写字母个数
    1.题目读题 HJ84 统计大写字母个数 考查点 2.解法思路 代码逻辑 具体实现 publicclassHJ084{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println(countUpper(sc.nextLine()));}......
  • 1-14 编写一个程序,打印输入中各个字符出现频度的直方图
    ArchlinuxGCC13.1.1 202304292023-07-1123:25:36星期二 做了调整,只输出大小写字母共计56个字符的横向直方图,如有其他需要,自行添加。点击查看代码#include<stdio.h>#defineTRUE1#defineFALSE0intmain(){intc_in;intc_num[52];intc......