【华为机试025】字符串排序

题目描述:

编写一个程序,将输入字符串中的字符按如下规则排序。

规则 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).

Java实现:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str = sc.nextLine();
            char[] arr = str.toCharArray();
            //冒泡排序,具有稳定性,不断将较大的字符放到后面,非字母的字符不动
            /*
            for (int k = arr.length-1; k >= 0; k--) {
                int i = 0;
                for (int j = 0; j <= k; j++) {
                    if (Character.isLetter(arr[j])) {
                       if (Character.toLowerCase(arr[i]) > Character.toLowerCase(arr[j])) {
                           swap(arr, i, j);
                       }
                       i = j;
                    }
                }
            }
        
            System.out.println(String.valueOf(arr));
            */
            //挨个判断26个字母,对于从a到z的每个字母,遍历一遍字符串,不断按序添加到sb中
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < 26; i++) {
                char c = (char) (i+'A');
                for (int j = 0; j < arr.length; j++) {
                    if (arr[j] == c || arr[j] == (char)(c+32) )
                        sb.append(arr[j]);
                }
            }
            
            for (int i = 0; i < arr.length; i++) {
                if (!Character.isLetter(arr[i]))
                    sb.insert(i, arr[i]);
            }
            System.out.println(sb.toString());
        }
        
    }
    
    private static void swap(char[] arr, int i, int j) {
        char t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
        
    }
}

知识点:

  • 冒泡排序时间复杂度为O(n^2),第二种虽然需要额外的空间,但时间复杂度为O(n)
  • StringBuilder里的assert()方法可以把一个字符插入到任意位置
  • Character类里的toLowerCase()方法和isLetter()方法

猜你喜欢

转载自blog.csdn.net/heyiamcoming/article/details/80647906