题解 | #字符串排序#

字符串排序

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

规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
规则1的意思就是排序
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
规则2的意思就是排序算法是稳定的
规则 3 :非英文字母的其它字符保持原来的位置。
规则3的意思就是排序时跳过这些字符

这里我选择了简单的插入排序来实现字符串排序 也可以选择其他的稳定排序算法 看个人喜好

import java.util.Arrays;
import java.util.Scanner;
import static java.lang.Character.*;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char[] chars = in.nextLine().toCharArray();
        for (int i = 0; i < chars.length; i++) {
            for (int j = i; j > 0; ) {
                int fst = lastLetterIndex(chars, j);
                int snd = lastLetterIndex(chars, fst - 1);
                j = fst - 1;
                if (fst != -1 && snd != -1 && toUpperCase(chars[fst]) < toUpperCase(chars[snd])) {
                    swap(chars, fst, snd);
                } else {
                    break;
                }
            }
        }
        System.out.println(String.valueOf(chars));
    }

    static void swap(char[] chars, int idx1, int idx2) {
        if (idx1 == idx2) {
            return;
        }
        char temp = chars[idx1];
        chars[idx1] = chars[idx2];
        chars[idx2] = temp;
    }

    static int lastLetterIndex(char[] arr, int a) {
        if (a < 0) {
            return -1;
        }
        if (isLetter(arr[a])) {
            return a;
        }
        for (int i = a - 1; i >= 0; i--) {
            if (isLetter(arr[i])) {
                return i;
            }
        }
        return -1;
    }
}

看了热门题解 改了一下

import java.util.*;
import java.util.stream.*;
import static java.lang.Character.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        String sortedLetters = Stream.of(str.split(""))
            .filter(x -> isLetter(x.charAt(0)))
            .sorted(Comparator.comparing(String::toUpperCase))
            .reduce((x, y) -> x + y)
            .orElse(null);
        int i = 0;
        StringBuilder sb = new StringBuilder();
        for (char c : str.toCharArray()) {
            if (!isLetter(c)) {
                sb.append(c);
            } else {
                sb.append(sortedLetters.charAt(i++));
            }
        }
        System.out.println(sb);
    }
}




#华为笔试#
全部评论

相关推荐

03-27 16:40
已编辑
门头沟学院 C++
26学院本太难了,很多公司机筛就给我刷了。机会都难拿到如果是简历存在问题也欢迎拷打————————————————————分割线——————————————————————2026.3.4更新:发完贴之后,时不时投递又收到了不少的笔试/面试邀请。主要是之前投递简历出去之后基本上都是沉默状态,年后好转了不少timeline:2026.01.21&nbsp;文远知行笔试,半年多没刷算法题&nbsp;-&gt;挂&nbsp;(后续HR说春招可以重新安排笔试)2026.2.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;小鹏汇天&nbsp;技术一面,第二周收到结果&nbsp;-&gt;挂2026.2.12&nbsp;&nbsp;&nbsp;大众Cariad代招&nbsp;技术二面&nbsp;-&gt;Offer2026.2.28&nbsp;&nbsp;&nbsp;多益网络技术面试,由于风评太差,一直在犹豫要不要接面试&nbsp;-&gt;推迟-----------分割线-----------2026.3&nbsp;月前的某一天,临时去电网报名了二批计算机岗位的笔试2026.3.6&nbsp;从上家公司实习离职,氛围最好的一家公司,leader&nbsp;说可以帮忙转正,但是流程太长,而且我们部门据说只有一个&nbsp;hc,更想要研究生,我很有可能是会被签外包公司在这里干活,就离职了。2026.3.9&nbsp;入职新公司,大众Cariad&nbsp;以外部公司的身份进组,项目组签了三年,后续三年应该都可以在这里呆,不知道有没有希望原地跳槽。2026.3.10&nbsp;电网考试居然说我通过资格审查了,短信约我去参加资格审查,请假一天,买了&nbsp;12&nbsp;号晚上的机票回成都2026.3.15&nbsp;参加国家电网计算机类笔试2026.3.17&nbsp;电网出成绩了,感觉很低。觉得已经🈚️了2026.3.18&nbsp;收到电网面试通知,通知&nbsp;3.22-3.25&nbsp;这个时间去面试,我的岗位只招&nbsp;1&nbsp;个人。据说面试只有&nbsp;2-3&nbsp;人,不知道能不能成功----------分割线-----------2026.3.21&nbsp;电网面试结束,感觉回答的还勉勉强强,大概是2个岗位分别招1个人,一共11人面试,实际来了9人2026.3.27&nbsp;出面试成绩,满分100分,早上10:20左右发现面试成绩46,我震惊了,没截图,后面过了十分钟重新看发现面试成绩给我改成58了。但同样震惊。朋友问我是不是把面试官打了,哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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