华为机试HJ-26 字符串排序

日常刷题记录,欢迎讨论交流。

最近有点魔怔了,凡事都优先想到了二维数组和数组下标法,囧~

 

牛客网题目链接:https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584

 

描述

编写一个程序,将输入字符串中的字符按如下规则排序。

规则 1 :英文字母从 A 到 Z 排列,不区分大小写。

如,输入: Type 输出: epTy

规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。

如,输入: BabA 输出: aABb

规则 3 :非英文字母的其它字符保持原来的位置。

如,输入: By?e 输出: Be?y
 
 
数据范围:输入的字符串长度满足 1n1000 

 

输入描述:

输入字符串

输出描述:

输出字符串

示例1

输入:
A Famous Saying: Much Ado About Nothing (2012/8).
输出:
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
 
 1 import java.util.Scanner;
 2 
 3 public class Main{
 4     public static void main(String[] args){
 5         Scanner sc = new Scanner(System.in);
 6         String str = sc.nextLine();
 7 //         System.out.println(str);
 8         String strabc = str.replaceAll("[^a-zA-Z]","");
 9 //         System.out.println(strabc);
10         String[][] strarr = new String[128][str.length()];
11         char[] ch = strabc.toCharArray();//将原始字母序列存起来
12         char[] chLowerCase = strabc.toLowerCase().toCharArray();//全部改成小写,用于将相同大小写字母(如:Aa)映射到相同的数组行
13         int minindex = 0;
14         int maxindex = 0;
15         for(int i = 0; i < strabc.length(); i++){
16             int rowindex = new Character(chLowerCase[i]).charValue();
17             for(int j = 0; j < strabc.length(); j++){
18                 if(null == strarr[rowindex][j]){
19                     strarr[rowindex][j] = Character.toString(ch[i]);
20                     break;
21                 }
22             }
23             minindex = Math.min(rowindex,minindex);
24             maxindex = Math.max(rowindex,maxindex);
25         }
26         //输出排好序的字母序列
27         String strtemp = "";
28         for(int m = minindex; m <= maxindex; m++){
29             for(int n = 0; n < strabc.length(); n++){
30                 if(null != strarr[m][n]){
31                     strtemp = strtemp + strarr[m][n];
32                 }
33             }
34         }
35 //         System.out.println("strtemp: "+strtemp);
36         //将原始字符串里面的字母替换成可以识别且不冲突的字符,用来标记哪些位置是需要替换新内容的
37         String strcharacter = str.replaceAll("[a-zA-Z]","A");
38         char[] chfinal = strcharacter.toCharArray();
39         char[] chtemp = strtemp.toCharArray();
40         int num = 0;
41         for(int index = 0; index < strcharacter.length(); index++){
42             if(chfinal[index] == 'A'){
43                 chfinal[index] = chtemp[num];
44                 num++;
45             }
46         }
47         System.out.println(chfinal);
48     }
49 }

 

解题思路:

  1.先把字母找出并存起来,创建一个二维数据,将26个字母(忽略大小写,此处全用小写)的ASCII值映射到二维数组的行下标,数组对应的列用来存放相同字母对应的原始字母(分大小写)。
  2.按顺序遍历数组获得排好序的字母序列。
  3.利用原始字符串的字母位置特征,把里面的字母替换成可识别且不与其它字符冲突的字符,然后遍历原始数据,将排好序的字母序列更新进去。

  应该还有更好的方法,后续补充~

 

posted @ 2022-07-08 23:07  小小米-Hwang  阅读(146)  评论(0)    收藏  举报