IT评测·应用市场-qidao123.com

标题: 【华为OD题库-016】字符串择要-Java [打印本页]

作者: 熊熊出没    时间: 2025-3-20 13:28
标题: 【华为OD题库-016】字符串择要-Java
给定一个字符串的择要算法,请输出给定字符串的择要值
1、去除字符串中非字母的符号
2、假如出现连续字符(不区分巨细写),则输出:该字符(小)+连续出现的次数
3、假如黑白连续的宁符(不区分巨细写),则输出:该字符(小写)该字母之后字符串中出现的该字符的次数
4、对按照以上方式表示后的字符串举行排序:字母和紧随的数字作为一组举行排序,数字大的在前,数字相同的则按字母举行排序,字母小的在前。
输入描述:
行字符串,长度为[1,200]
输出描述:
择要字符串
示例1
输入:
aabbcc
输出:
a2b2c2
示例2
输入:
bAaAcBb
输出:
a3b2b2c0
阐明:
第一个b非连续字母,该字母之后字符串中还出现了2次(最后的两个Bb),以是输出b2。a连续出现3次,输出a3,c非连续,该字母之后字符串再没有出现过c,输出c0,Bb连续2次,输出b2
对b2、a3、c0、b2举行排序,终极输出a3b2b2c0
   Java代码
 
  1. package odTest;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Collections;
  5. import java.util.Comparator;
  6. //import java.util.Comparator;
  7. import java.util.HashSet;
  8. import java.util.List;
  9. import java.util.Scanner;
  10. public class strAbstract {
  11.         public static void main(String[] args) {
  12.                 Scanner scanner = new Scanner(System.in);
  13.                 char[] strList = scanner.nextLine().toCharArray();
  14.                
  15.                 //用于存放已存在的大小写字符,防止重复计算
  16.                 HashSet<String> set = new HashSet<>();
  17.                 //用于存放最终的 字母+次数列表
  18.                 List<String> list = new ArrayList<>();
  19.                 for(int i=0;i<strList.length;i++) {
  20.                         //计数
  21.                         int count = 0;
  22.                         //作用:判断每一次当前循环,是否属于此字母的大小写。
  23.                         String line = "";
  24.                         //作用:记录当前字母,连续与不连续出现的次数的字符串
  25.                         String countStr = "";
  26.                         //由于题目是输出小写字母,我在一开始把小写字母保存下来,大写变小写
  27.                         String downLetter = "";
  28.                         // 只要集合里存在这个字母的大小写,说明已经判断过了,直接跳过
  29.                         if(set.contains(strList[i]+"")) {
  30.                                 continue;
  31.                         }
  32.                         //这里判断当前字母,并将大小写字母分别加入到set集合,然后,把当前字母的大小写存在line中,以便判断后续字母否是属于当前字母。
  33.                         //并将小写字母给赋值了
  34.                         if(strList[i]>='a'&&strList[i]<='z') {
  35.                                 set.add(strList[i]+"");
  36.                                 set.add(Character.toString((char) (strList[i]-32))+"");
  37.                                 line = strList[i]+" "+(Character.toString((char) (strList[i]-32)));
  38.                                 downLetter = strList[i]+"";
  39.                         }else {
  40.                                 set.add(strList[i]+"");
  41.                                 set.add(Character.toString((char) (strList[i]+32))+"");
  42.                                 line = strList[i]+" "+(Character.toString((char) (strList[i]+32)));
  43.                                 downLetter = Character.toString((char) (strList[i]+32));
  44.                         }
  45.                         //这里循环,当前字母后面的字母,判断,出现的次数
  46.                         for(int j=i;j<strList.length;j++) {
  47.                                 if(line.contains(strList[j]+"")) {
  48.                                         count = count+1;
  49.                                         //这里很关键!当下一个不是当前字母的时候,直接把当前计数存入countStr,这样就可以通过数组区分是间断,还是连续。
  50.                                         if(j+1>=strList.length||!line.contains(strList[j+1]+"")) {
  51.                                                 countStr = countStr+count+" ";
  52.                                                 count = 0;
  53.                                         }
  54.                                 }
  55.                         }
  56.                         //这里把记录字符串中的记录提取出来,如果长度为1,就是连续的,长度大于1就不连续需要进一步处理。
  57.                         int[] countList = Arrays.stream(countStr.split(" ")).mapToInt(Integer::parseInt).toArray();
  58.                         if(countList.length==1&&countList[0]==1) {
  59.                                 list.add(downLetter+" "+0);
  60.                                 continue;
  61.                         }else if(countList.length==1&&countList[0]>1) {
  62.                                 list.add(downLetter+" "+countList[0]);
  63.                                 continue;
  64.                         }
  65.                         //进一步处理,循环将不是最后一个值的累计。
  66.                         for(int n = 0;n<countList.length;n++) {
  67.                                         if(n+1==countList.length&&countList[n]==1) {
  68.                                                 list.add(downLetter+" "+0);
  69.                                                 continue;
  70.                                         }else if(n+1==countList.length&&countList[n]>1){
  71.                                                 list.add(downLetter+" "+countList[n]);
  72.                                                 continue;
  73.                                         }
  74.                                         //由于题目要求,需要跳过当前,判断后面字母出现和。
  75.                                         int[] current = Arrays.copyOfRange(countList, n+1, countList.length);
  76.                                         int sum = Arrays.stream(current).sum();
  77.                                         list.add(downLetter+" "+sum);
  78.                         }
  79.                 }
  80.                 //这里排序
  81.                 Collections.sort(list, new Comparator<String>() {
  82.             @Override
  83.             public int compare(String o1, String o2) {
  84.                     int o1Array = Integer.parseInt(o1.split(" ")[1]);
  85.                     int o2Array = Integer.parseInt(o2.split(" ")[1]);
  86.                     if(o1Array<o2Array) {
  87.                             return 1;
  88.                     }
  89.                     if(o1Array == o2Array) {
  90.                             return o1.compareTo(o2);
  91.                     }
  92.                                 return -1;
  93.                  
  94.             }
  95.         });
  96.                 list.forEach(m->{
  97.                         m = m.replace(" ", "");
  98.                         System.out.print(m);
  99.                 });
  100.         }
  101.        
  102. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4