• 考研机试 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;
        }
    }
    努力,向上,自律
  • 相关阅读:
    Linux中的用户和用户组
    GCC编译过程
    C++设计模式——单例模式(转)
    快速排序之python
    归并排序之python
    计数排序之python
    希尔排序之python
    插入排序之python
    选择排序之python
    冒泡排序之python
  • 原文地址:https://www.cnblogs.com/machi12/p/14507693.html
Copyright © 2020-2023  润新知