题解 | #字符串排序#

字符串排序

https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584

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

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
//         System.out.println(str);
        String strabc = str.replaceAll("[^a-zA-Z]","");
//         System.out.println(strabc);
        String[][] strarr = new String[128][str.length()];
        char[] ch = strabc.toCharArray();//将原始字母序列存起来
        char[] chLowerCase = strabc.toLowerCase().toCharArray();//全部改成小写,用于将相同大小写字母(如:Aa)映射到相同的数组行
        int minindex = 0;
        int maxindex = 0;
        for(int i = 0; i < strabc.length(); i++){
            int rowindex = new Character(chLowerCase[i]).charValue();
            for(int j = 0; j < strabc.length(); j++){
                if(null == strarr[rowindex][j]){
                    strarr[rowindex][j] = Character.toString(ch[i]);
                    break;
                }
            }
            minindex = Math.min(rowindex,minindex);
            maxindex = Math.max(rowindex,maxindex);
        }
        //输出排好序的字母序列
        String strtemp = "";
        for(int m = minindex; m <= maxindex; m++){
            for(int n = 0; n < strabc.length(); n++){
                if(null != strarr[m][n]){
                    strtemp = strtemp + strarr[m][n];
                }
            }
        }
//         System.out.println("strtemp: "+strtemp);
        //将原始字符串里面的字母替换成可以识别且不冲突的字符,用来标记哪些位置是需要替换新内容的
        String strcharacter = str.replaceAll("[a-zA-Z]","A");
        char[] chfinal = strcharacter.toCharArray();
        char[] chtemp = strtemp.toCharArray();
        int num = 0;
        for(int index = 0; index < strcharacter.length(); index++){
            if(chfinal[index] == 'A'){
                chfinal[index] = chtemp[num];
                num++;
            }
        }
        System.out.println(chfinal);
    }
}



#华为机试#
全部评论

相关推荐

Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务