zoukankan      html  css  js  c++  java
  • 考研机试 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;
        }
    }
    努力,向上,自律
  • 相关阅读:
    LCA+链式前向星模板
    truffle编译合约常见问题及其在私链上的部署与交互
    RMQ入门解析
    最短路_搜索
    无向图边双联通分量+缩点
    有向图+强联通分量
    染色法判二分
    邻接表存图
    贪心算法
    贪心算法
  • 原文地址:https://www.cnblogs.com/machi12/p/14507693.html
Copyright © 2011-2022 走看看