考研机试 76.字符串排序

时间:2021/03/09

一.题目描述

编写一个程序,将输入字符串中的字符按如下规则排序(一个测试用例可能包含多组数据,请注意处理)。

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

如,输入: Type 输出: epTy

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

如,输入: BabA 输出: aABb

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

如,输入: By?e 输出: Be?y

样例:

输入:

A Famous Saying: Much Ado About Nothing(2012/8).

输出:

A aaAAbc dFgghh : iimM nNn oooos Sttuuuy (2012/8).

示例输入

A Famous Saying: Much Ado About Nothing (2012/8).

示例输出

A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).

题目链接

https://www.nowcoder.com/practice/d9aa3894d3aa4887843a85d26daa4437?

tpId=40&tqId=21407&rp=1&ru=%2Fta%2Fkaoyan&qru=%2Fta%2Fkaoyan%2Fquestion-ranking&tab=answerKey

二.算法

题解

读入输入的一行字符串后转化为字符数组,然后将该行字符串中的所有字母放入到辅助数组temp中。定义一个符合题目规则的字符比较方法,然后根据题目的要求对temp数组进行排序。遍历原字符数组,当遇到字母时输出temp数组相应下标的字符,当遇到非字母时输出字符数组中相应位置的非字母。注意:这里使用的排序算法必须是稳定的排序算法,比如冒泡排序。

重点

冒泡排序是一种稳定的排序算法,使用时要注意一次排序确定的是最大值还是最小值,因为这会影响到两个循环的起始和结束位置。

代码

import java.util.Scanner;

public class Main{
    
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            //读取输入
            char[] ch = (in.nextLine()).toCharArray();
            //将字母都存放到temp数组中
            int len = ch.length;
            char[] temp = new char[len];
            int index = 0;
            for(int i = 0; i < len; i++){
                if((ch[i] >= 'a' && ch[i] <= 'z') || (ch[i] >= 'A' && ch[i] <='Z')){
                    temp[index++] = ch[i];
                }
            }
            //根据题目给出规则对temp数组进行排序
            boolean flag = false;
            for(int i = 0; i < index - 1; i++){
                for(int j = 0; j < index - 1 - i; j++){
                    if(compare(temp[j], temp[j + 1])){
                        char c = temp[j];
                        temp[j] = temp[j + 1];
                        temp[j + 1] = c;
                        flag = true;
                    }
                }
                if(!flag){
                    break;
                }
            }
            //按照规则进行输出
            int pos = 0;
            for(int i = 0; i < len; i++){
                if((ch[i] >= 'a' && ch[i] <= 'z') || (ch[i] >= 'A' && ch[i] <= 'Z')){
                    System.out.print(temp[pos++]);
                }else{
                    System.out.print(ch[i]);
                }
            }
            System.out.println();
        }
        in.close();
    }
    
    //对给出的两个字符按照规则比较大小
    public static boolean compare(char a, char b){
        if(a >= 'A' && a <= 'Z'){
            a = (char)(a + 'a' - 'A');
        }
        if(b >= 'A' && b <= 'Z'){
            b = (char)(b + 'a' - 'A');
        }
        return a > b;
    }
}
努力,向上,自律
原文地址:https://www.cnblogs.com/machi12/p/14507693.html