题解 | #字符串排序#

字符串排序

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

import java.util.*;

// 因为涉及不区分大小写排序,所以稳定的冒泡排序任然会出现大小写交换的情况,所以使用选择排序的变种,对每次交换数据都要将需要交换的两列之间的字符向后移动以保证相对顺序不变

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String line = in.nextLine(); // 2 13 2
            char[] array = line.toCharArray();
            for (int i = 0; i < array.length; i++) {
                int idx = i;// 每次选择最小的数据
                if (array[i] >= 'A' && array[i] <= 'Z' || array[i] >= 'a' && array[i] <= 'z') { // 跳过非字母
                    for (int j = i + 1; j < array.length; j++) {
                        if (array[j] >= 'A' && array[j] <= 'Z' || array[j] >= 'a' && array[j] <= 'z') {
                            int ai = array[idx] > 'Z' ? array[idx] - 32 : array[idx];
                            int aj = array[j] > 'Z' ? array[j] - 32 : array[j];
                            if (ai > aj) {
                                idx = j;
                            }
                        }
                    }
                }
                if (idx != i) { // 数据交换
                    char tmp = array[i];
                    array[i] = array[idx];
                    for (int k = idx - 1; k  > i; k--) {
                        if (array[k] >= 'A' && array[k] <= 'Z' || array[k] >= 'a' && array[k] <= 'z') {// 跳过非字母
                            array[idx] = array[k];// idx不断变成前面一个字母的位置
                            idx = k;
                        }
                    }
                    array[idx] = tmp;
                }
            }
            System.out.println(String.valueOf(array));
        }
    }
}

全部评论

相关推荐

孤寡孤寡的牛牛很热情:为什么我2本9硕投了很多,都是简历或者挂,难道那个恶心人的测评真的得认真做吗
点赞 评论 收藏
分享
小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务