单词分析蓝桥杯(int转化char)

该代码示例展示了如何使用Java处理用户输入的字符串,统计每个字符出现的次数并进行排序。初始方法使用了两次循环,后进行了优化,利用哈希法减少空间复杂度。最终通过比较找出出现次数最多的字符并输出其对应的ASCII值。
摘要由CSDN通过智能技术生成
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.nextLine();
        int n = s.length();
        int temp = 0;
        int[] nums = new int[n];
        int[] sc = new int[26];
        for(int i=0;i<n;i++)
        {
          nums[i]=s.charAt(i);  //如果a,那么nums[i]=97
        }
        //for(int i=0;i<n-1;i++)
        //for(int j=0;j<n-i-1;j++)
        //{
        //    if(nums[j]>nums[j+1]){
        //         temp=nums[j];
        //         nums[j]=nums[j+1];
        //         nums[j+1]=temp;
        //    }
        //}
        
         for(int i=0;i<n;i++)
        {
          if(nums[i]==97){sc[0]++;}
          if(nums[i]==98){sc[1]++;}
          if(nums[i]==99){sc[2]++;}
          if(nums[i]==100){sc[3]++;}
          if(nums[i]==101){sc[4]++;}
          if(nums[i]==102){sc[5]++;}
          if(nums[i]==103){sc[6]++;}
          if(nums[i]==104){sc[7]++;}
          if(nums[i]==105){sc[8]++;}
          if(nums[i]==106){sc[9]++;}
          if(nums[i]==107){sc[10]++;}
          if(nums[i]==108){sc[11]++;}
          if(nums[i]==109){sc[12]++;}
          if(nums[i]==110){sc[13]++;}
          if(nums[i]==111){sc[14]++;}
          if(nums[i]==112){sc[15]++;}
          if(nums[i]==113){sc[16]++;}
          if(nums[i]==114){sc[17]++;}
          if(nums[i]==115){sc[18]++;}
          if(nums[i]==116){sc[19]++;}
          if(nums[i]==117){sc[20]++;}
          if(nums[i]==118){sc[21]++;}
          if(nums[i]==119){sc[22]++;}
          if(nums[i]==120){sc[23]++;}
          if(nums[i]==121){sc[24]++;}
          if(nums[i]==122){sc[25]++;}
        }
        int[] sc1 = new int[26];
        for(int i=0;i<26;i++)
         {
            sc1[i]=sc[i];
         }
        for(int i=0;i<26-1;i++)
         {
            if(sc1[i]>sc1[i+1]){
                 temp=sc1[i];
                 sc1[i]=sc1[i+1];
                 sc1[i+1]=temp;}
         }
        int num = sc1[25];  
        //System.out.println(num);
        //int num = Math.max(sc);
        int z = 0;
        for(int i=0;i<26;i++)
        {
          if(sc[i]==num){
            z=i;
            break;
          }
        }
        System.out.println((char)(z+96+1));  //强制转换,将ASCII码z+96+1的int转换为char
        //if(z==0){System.out.println('a');}
        //if(z==1){System.out.println('b');}
        //if(z==2){System.out.println('c');}
        //if(z==3){System.out.println('d');}
        //if(z==4){System.out.println('e');}
        //if(z==5){System.out.println('f');}
        //if(z==6){System.out.println('g');}
        //if(z==7){System.out.println('h');}
        //if(z==8){System.out.println('i');}
        //if(z==9){System.out.println('j');}
        //if(z==10){System.out.println('k');}
        //if(z==11){System.out.println('l');}
        //if(z==12){System.out.println('m');}
        //if(z==13){System.out.println('n');}
        //if(z==14){System.out.println('o');}
        //if(z==15){System.out.println('p');}
        //if(z==16){System.out.println('q');}
        //if(z==17){System.out.println('r');}
        //if(z==18){System.out.println('s');}
        //if(z==19){System.out.println('t');}
        //if(z==20){System.out.println('u');}
        //if(z==21){System.out.println('v');}
        //if(z==22){System.out.println('w');}
        //if(z==23){System.out.println('x');}
        //if(z==24){System.out.println('y');}
        //if(z==25){System.out.println('z');}
        System.out.println(sc[z]);
        scan.close();
    }
}

int转char:

一种是自动转换,如char c = 97,会自动的将int类型的97转换成char的‘a’

另一种是强制类型转换,如char c = (char) 97,char的值也是‘a’

改进解法:使用哈希法

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法

但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

数组就是简单的哈希表,但是数组的大小可不是无限开辟的

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.nextLine();
        int[] sc = new int[26];
        int[] sc1 = new int[26];
        int temp = 0;
        for(int i=0;i<s.length();i++)    //从字符'a'到索引0的转换
        { 
          sc[ (int)s.charAt(i)- 97 ]++;   //先转化成int再减数字
          //sc[ s.charAt(i)- 97 ]++;可以,字符减数字是数字(但最好类型一致)
          //sc[ s[i]-'a' ]++;可以,两个字符相减是数字
          //string的s[i]是C++才可以,java必须使用s.charAt[i]才能找到第i个字符
        }

        //sc1=sc;   //这样会导致结果错误,sc1和sc共同指向原始的sc数组,
                   //那么改变sc1的同时也会改变sc,因此sc1[25]也就是sc[25]
                   //所以不管输入是多少,结果都会是i=25,输出字符z

        for(int i=0;i<26;i++){
          sc1[i]=sc[i];
        }
        for(int i=0;i<26-1;i++){
          if(sc1[i]>sc1[i+1]){
             temp=sc1[i];
             sc1[i]=sc1[i+1];
             sc1[i+1]=temp;
          }
        }
        for(int i=0;i<26;i++)
        {
          if(sc[i]==sc1[25]){
              System.out.println((char)(i+97));
              System.out.println(sc1[25]);
              break;  //必须有break,不然不会跳出循环, System.out.println并不会结束程序
          }
        }
        
        scan.close();
    }
}

在取最大值部分还能改进,上述是通过重新定义一个一样的数组,通过冒泡排序获得最大值

我们如何在不影响原有顺序的情况下获得数组中的最大值(不使用Math.max(),并且Math.max不适用于数组)

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.nextLine();
        int[] sc = new int[26];
        int[] sc1 = new int[26];
        int temp = 0;
        for(int i=0;i<s.length();i++)    //从字符'a'到索引0的转换
        { 
          sc[ (int)s.charAt(i)- 97 ]++;   //先转化成int再减数字
          //sc[ s.charAt(i)- 97 ]++;可以,字符减数字是数字(但最好类型一致)
          //sc[ s[i]-'a' ]++;可以,两个字符相减是数字
          //string的s[i]是C++才可以,java必须使用s.charAt[i]才能找到第i个字符
        }

        //sc1=sc;   //这样会导致结果错误,sc1和sc共同指向原始的sc数组,
                   //那么改变sc1的同时也会改变sc,因此sc1[25]也就是sc[25]
                   //所以不管输入是多少,结果都会是i=25,输出字符z

        int max = sc[0];
        for(int i=1;i<26;i++)
        {
          if(max<sc[i])
          { 
           max=sc[i];
          }
        }
        for(int i=0;i<26;i++)
        {
          if(sc[i]==max){
              System.out.println((char)(i+97));
              System.out.println(max);
              break;  //必须有break,不然不会跳出循环, System.out.println并不会结束程序
          }
        }
        
        scan.close();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值