• 华为OD真题--字符串摘要--带答案


    更多2023面试系列在主页文章

     1. 华为OD机考题 + 答案

    2023华为OD统一考试(A+B卷)题库清单-带答案(持续更新)

    2023年华为OD真题机考题库大全-带答案(持续更新)

    题目描述:

    给定一个字符串的摘要算法,请输出给定字符串的摘要值

    1、去除字符串中非字母的符号

    2、如果出现连续字符 (不区分大小写) ,则输出: 该字符 (小) + 连续出现的次数

    3、如果是非连续的字符(不区分大小写) ,则输出: 该字符(小写) 该字母之后字符串中出现的该字符的次数4、对按照以上方式表示后的字符串进行排序: 字母和紧随的数字作为一组进行排序,数字大的在前,数字相同的则按字母进行排序,字母小的在前。

    输入描述:

    行字符串,长度为[1,200]

    输出描述:

    摘要字符串

    示例1

    输入:

    aabbcc

    输出:

    a2b2c2

    示例2

    输入:

    bAaAcBb

    输出:

    a3b2b2c0

    说明:

    第一个b非连续字母,该字母之后字符串中还出现了2次 (最后的两个Bb) ,所以输出b2,a连续出现3次,输出a3,

    c非连续,该字母之后字符串再没有出现过c,输出c0Bb连续2次,输出b2

    对b2a3c0b2进行排序,最终输出a3b2b2c0

    解题思路(非最优)

    1. 使用正则表达式,将字母都获取出来

    2. 使用双指针遍历

            2.1 使用标志位判断是否连续字母,还是相隔的字母

            2.2 连续的字母是累计当前次数+1,非连续字母是统计后面的字母数量

            2.3 连续字母中断后,将右指针的值赋值给左指针,跳过这连续字母的下标

            2.4 每次遍历后次数,右指针值重新赋值

            2.5 储存是小写字母数值,这里的储存使用对象

    3. 排序

            3.1 先比较次数大小,相等在比较字母的顺序

    1. public static void main(String[] args) {
    2. Scanner sc = new Scanner(System.in);
    3. String value = sc.nextLine();
    4. StringBuffer sb = new StringBuffer();
    5. int index = 0;
    6. for (int i = 1; i <= value.length();i++){
    7. //1、去除字符串中非字母的符号
    8. Pattern pattern = Pattern.compile("[a-zA-Z]+");
    9. Matcher matcher = pattern.matcher((value.substring(index,i)));
    10. if (matcher.find()){
    11. sb.append(matcher.group());
    12. }
    13. index++;
    14. }
    15. List<Info> end = save(sb);
    16. sort(end);
    17. }
    18. public static List<Info> save(StringBuffer sb){
    19. //双指针
    20. int left = 0;
    21. int right = 1;
    22. int count = 0;
    23. Boolean flag = false;
    24. List<Info> infoList = new ArrayList<>();
    25. while (left != sb.length() && right != sb.length()) {
    26. //当前值
    27. String now = sb.substring(left, left + 1);
    28. //最后一个字符
    29. if (left + 1 == sb.length()) {
    30. Info info = new Info(0, now.toLowerCase(Locale.ROOT));
    31. infoList.add(info);
    32. break;
    33. }
    34. String after = sb.substring(right, right + 1);
    35. if (now.equalsIgnoreCase(after)) {
    36. count++;
    37. if (right - left <= 1) {
    38. flag = true;//是否连续标志
    39. }
    40. if (right + 1 == sb.length()) {
    41. if (flag) { //连续值+1
    42. count++;
    43. }
    44. Info info = new Info(count, now.toLowerCase(Locale.ROOT));
    45. infoList.add(info);
    46. //移动右指针
    47. right = left + 1;
    48. left++; //移动左指针
    49. count = 0;
    50. }
    51. right++;//连续值下标
    52. } else {
    53. // 2、如果出现连续字符 (不区分大小写) ,则输出: 该字符 (小) + 连续出现的次数
    54. if (flag) {//连续 中断时保存是数据
    55. left = right;//跳过连续值
    56. count++;
    57. Info info = new Info(count, now.toLowerCase(Locale.ROOT));
    58. infoList.add(info);
    59. count = 0;
    60. if (right + 1 == sb.length()) { //重新赋值右指针
    61. right = left + 1;
    62. }
    63. // 3、如果是非连续的字符(不区分大小写) ,则输出: 该字符(小写) 该字母之后字符串中出现的该字符的次数
    64. } else if (!flag) { //非连续
    65. if (right + 1 == sb.length()) {
    66. Info info = new Info(count, now.toLowerCase(Locale.ROOT));
    67. infoList.add(info);
    68. count = 0;
    69. right = left + 1;
    70. left++;
    71. }
    72. }
    73. right++;//跳过连续值
    74. if (right == sb.length()) {
    75. right = left;
    76. }
    77. flag = false;
    78. }
    79. }
    80. return infoList;
    81. }
    82. /**
    83. * 4、对按照以上方式表示后的字符串进行排序: 字母和紧随的数字作为一组进行排序,数字大的在前,数字相同的则按字母进行排序,字母小的在前。
    84. * @param infoList
    85. */
    86. public static void sort(List<Info> infoList){
    87. Collections.sort(infoList,new SoutSummary());
    88. infoList.forEach(data -> System.out.print(data.getS() + data.getCount()));
    89. }
    90. static class SoutSummary implements Comparator<Info>{
    91. @Override
    92. public int compare(Info o1, Info o2) {
    93. //先比较次数的大小
    94. if (o1.getCount() > o2.getCount()){
    95. return -1;
    96. }else if (o1.getCount() < o2.getCount()){
    97. return 1;
    98. //如果次数相等
    99. }else {
    100. return o2.getS().compareTo(o2.getS());
    101. }
    102. }
    103. }
    104. static class Info{
    105. int count;
    106. String s;
    107. public Info(int count, String s){
    108. this.count = count;
    109. this.s = s;
    110. }
    111. public Info() {
    112. }
    113. public int getCount() {
    114. return count;
    115. }
    116. public void setCount(int count) {
    117. this.count = count;
    118. }
    119. public String getS() {
    120. return s;
    121. }
    122. public void setS(String s) {
    123. this.s = s;
    124. }
    125. }

  • 相关阅读:
    2021年CSDN年度总结:回顾过去 掌握现在 展望未来
    Source Map知多少?Golang手写SourceMap转换过程
    使用k8s helm离线部署spark-operator(私有仓库)
    匿名访问查看服务器samba用户名实现smbclient -L
    SpringBoot 实战 开发中 16 条最佳实践
    JavaScript
    开发指导—利用组件&插值器动画实现 HarmonyOS 动效
    MySQL---运算符
    数据结构C语言之线性表
    SpringBoot + Apache tika 轻松实现各种文档内容解析
  • 原文地址:https://blog.csdn.net/weixin_42450130/article/details/132710236