华为OD机试 2023B卷题库疯狂收录中,刷题点这里
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
给定一个字符串的摘要算法,请输出给定字符串的摘要值:
一行字符串。
摘要字符串。
package com.guor.od;
import java.util.Scanner;
import java.util.*;
public class OdTest03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 不区分大小写
String line = sc.nextLine().toLowerCase();
// 字母出现的次数
int[] chCountArr = new int[128];
// 字符串中的字母
StringBuilder builder = new StringBuilder();
for (int i = 0; i < line.length(); i++) {
char c = line.charAt(i);
if (c >= 'a' && c <= 'z') {
chCountArr[c]++;
builder.append(c);
}
}
line = builder.toString();
// 统计连续字符和非连续字符的字符和个数
List<MyCharBean> charList = new ArrayList<MyCharBean>();
// 该字母连续次数记为1
int continuousCount = 1;
// 遍历输入的字符串
for (int i = 0; i < line.length(); i++) {
// 当前字母
char current = line.charAt(i);
// 下一个字符
char next = ' ';
// 如果不是最后一个字符
if (i + 1 != line.length()) {
next = line.charAt(i + 1);
}
// 后面字符串中该字母的连续个数
chCountArr[current]--;
// 如果当前字母和上一个字母相同,该字母连续次数记为+1
if (current == next) {
continuousCount++;
// 如果当前字母和上一个字母不同
} else {
// 如果当前字符的连续次数大于1,表示是连续字符,输出即可
// 如果只有1个,则要获取后面字符串中该字符的个数
int num = continuousCount > 1 ? continuousCount : chCountArr[current];
charList.add(new MyCharBean(current, num));
// 更新current连续次数为1
continuousCount = 1;
}
}
// 字母和紧随的数字作为一组进行排序,数字大的在前,数字相同时,按字母进行排序,字母小的在前
charList.sort((x, y) -> x.num != y.num ? y.num - x.num : x.ch - y.ch);
StringBuilder sb = new StringBuilder();
for (MyCharBean c : charList) {
sb.append(c.toString());
}
System.out.println(sb);
}
/**
* 字母出现的次数
*/
static class MyCharBean {
// 字母
char ch;
// 字母出现的次数
int num;
public MyCharBean(char ch, int num) {
this.ch = ch;
this.num = num;
}
/**
* 按指定格式输出
*/
@Override
public String toString() {
return this.ch + "" + this.num;
}
}
}
abcccbbaa
c3a2a2b2b2
如果当前字符的连续次数大于1,表示是连续字符,输出即可
如果只有1个,则要获取后面字符串中该字符的个数
abcccbbaa
字母和紧随的数字作为一组进行排序,数字大的在前,数字相同时,按字母进行排序,字母小的在前
输出c3a2a2b2b2
。
abcccbbabaaccbca
a4b4a3c3a2b2c2b1a0b0c0
如果当前字符的连续次数大于1,表示是连续字符,输出即可
如果只有1个,则要获取后面字符串中该字符的个数
a4b4c3b2a3b1a2c2b0c0a0
字母和紧随的数字作为一组进行排序,数字大的在前,数字相同时,按字母进行排序,字母小的在前
a4b4a3c3a2b2c2b1a0b0c0
这么复杂?其实思路很简单,不信,你亲自来验证一下?
下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。