题解 | #字符串排序#

字符串排序

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);
    }
}




#华为笔试#
全部评论

相关推荐

dongsheng66:如果想进大厂的话,在校经历没必要占这么大篇幅,可以把专业技能单独放一个专栏写,可以加个项目经历
点赞 评论 收藏
分享
11-02 09:49
已编辑
货拉拉_测试(实习员工)
热爱生活的仰泳鲈鱼求你们别卷了:没事楼主,有反转查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务