1. 程式人生 > >華為機考試題(JAVA)

華為機考試題(JAVA)

試題1:字元子串拆分
描述:
給定兩個字串a和b,定義a*b標識兩個字串的連結。
例如:a=”abc”,b=”def”,則a*b=”abcdef”。
如果將連線看成乘法,則按照普遍的方法,一個非負整數的冪表示為:
a的0次方:a^0=””
a的1次方:a^1=a
a的2次方:a^2=a*a
……
a的n+1次方:a^(n+1)=a*(a^n)。

輸入:
字串s,長度在1~100之間。
輸出:
每個字串s,輸出最大的n和對應的a,使其滿足s=a^n。
例如:
s=”abcd”,則n=1, a=”abcd”
s=”aaaa”,則n=4,a=”a”
s=”ababab”,則n=3,a=”ab”
題目類別: 字串,搜尋
難度: 中級
分數:
執行時間限制: 無限制
記憶體限制: 無限制
階段: 應聘考試
輸入:
字串s,長度在1~100之間。

輸出:
每個字串s,輸出最大的n和對應的a,使其滿足s=an。
例如:
s=”abcd”,則n=1, a=”abcd”
s=”aaaa”,則n=4,a=”a”
s=”ababab”,則n=3,a=”ab”

樣例輸入:
ababab
樣例輸出:
3 ab

import java.util.*;

public class TestSplit {
    public static void main(String[] args) {

        while (true) {
            Scanner scn = new Scanner(System.in
); String input = scn.next(); int len = input.length(); if(len<=0){ System.out.println("error"); continue; } List<Integer> list = comDivisor(len); if (list.size() == 1) { System.out
.println(list.get(0) + " " + input); continue; } for (int i = 0; i < list.size(); i++) { int count = list.get(i); boolean flag = false; for (int j = 0; j < len / count - 1; ) { String a = input.substring(j * count, (j + 1) * count); String b = input.substring((j + 1) * count, (j + 2) * count); if (a.equals(b)) { flag = true; j += count; } else { flag = false; j += count; break; } } if (flag) { System.out.println(len / count + " " + input.substring(0, count)); break; } } } } public static List<Integer> comDivisor(int num) { List<Integer> lists = new ArrayList<Integer>(); for (int i = 1; i <= num; i++) { if (num % i == 0) { lists.add(i); } } return lists; } }

試題2:奇數偶數位置分別排序
輸入若干(不超過1000個)非負整數數字,請先取出為奇數的數字按從大到小排序,
再取出偶數從小到大排序
輸入8 12 3 7 6 5 9
9 8 6 3
5 7 12
輸出9 5 8 7 6 12 3

import java.util.Scanner;

public class SortJO {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            String str = scan.nextLine();
            sort(str);
        }
        scan.close();
    }

    private static void sort(String str) {
//去掉空格,儲存數字
        int str_length = str.length();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str_length; i++) {
            if (str.charAt(i) != ' ') {
                sb.append(str.charAt(i));
            }
        }
        char[] num = sb.toString().toCharArray();

        int length = num.length;

        int part_length = length / 2;//儲存一半數字,按照奇數偶數儲存
        char[] odd;
        char[] even;
//偶數個數字
        if (length % 2 == 0) {
            odd = new char[part_length];
            even = new char[part_length];
        } else {
//奇數個數字,多一個奇數
            odd = new char[part_length + 1];
            even = new char[part_length];
        }
        int index_odd = 0;
        int index_even = 0;
        for (int i = 0; i < length; i++) {
            if (i % 2 == 0) {

                odd[index_odd++] = num[i];
            } else {
                even[index_even++] = num[i];
            }
        }
        ascendingSort(odd);//奇數位升序
        descendingSort(even);//偶數位降序

        for (int i = 0; i < index_even; i++) {
            if (i == 0) {
                System.out.print(odd[i] + " " + even[i]);
            } else {
                System.out.print(" " + odd[i] + " " + even[i]);
            }
        }
        if (index_odd != index_even) {
            System.out.println(" " + odd[index_odd - 1]);
        }
    }

    private static void ascendingSort(char[] data) {
        int length = data.length;
        char temp = '*';
        for (int i = 0; i < length - 1; i++) {
            for (int j = i + 1; j < length; j++) {
                if (data[i] > data[j]) {
                    temp = data[i];
                    data[i] = data[j];
                    data[j] = temp;
                }
            }
        }
    }

    private static void descendingSort(char[] data) {
        int length = data.length;
        char temp = '*';
        for (int i = 0; i < length - 1; i++) {
            for (int j = i + 1; j < length; j++) {
                if (data[i] < data[j]) {
                    temp = data[i];
                    data[i] = data[j];
                    data[j] = temp;
                }
            }
        }
    }
}

試題3:查詢和排序
題目:輸入任意(使用者,成績)序列,可以獲得成績從高到低或從低到高的排列,相同成績
都按先錄入排列在前的規則處理。
例示:
jack 70
peter 96
Tom 70
smith 67
從高到低 成績
peter 96
jack 70
Tom 70
smith 67
從低到高
smith 67
Tom 70
jack 70
peter 96

輸入描述:
輸入多行,先輸入要排序的人的個數,然後分別輸入他們的名字和成績,以一個空格隔開

輸出描述:
按照指定方式輸出名字和成績,名字和成績之間以一個空格隔開

輸入例子:
3
0
fang 90
yang 50
ning 70

輸出例子:
fang 90
ning 70
yang 50

import java.util.*;
//儲存每個學生的基本資訊

public class Sort {


    static class Info{
        int index;//錄入序號
        String name;//姓名
        int score;//成績
        //構造方法
        public Info(int index , String name , int score){
            this.index = index;
            this.name = name;
            this.score = score;
        }
    }


    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        while(scan.hasNext()){
            List<Info> list = new ArrayList<Info>();//每次輸入資料前都要清空
            int stu_num = scan.nextInt();
            int sort_way = scan.nextInt();
            for(int i = 0 ; i < stu_num ; i++){
                String name = scan.next();
                int score = scan.nextInt();
                list.add(new Info(i , name , score));
            }
            //sort_way=0降序排列
            if(sort_way == 0){
                //自定義比較器
                Collections.sort(list , new Comparator<Info>() {
                    public int compare(Info o1, Info o2) {
                        if(o1.score != o2.score){
                            //後面減去前面,如果相減為負,表示降序
                            return o2.score - o1.score;
                        }else{
                            //分數相等,按照序號的優先順序儲存
                            //前面減去後面,如果相減為負,表示升序
                            return o1.index - o2.index;
                        }
                    }
                });
            }else{
                //sort_way=1升序排列
                Collections.sort(list , new Comparator<Info>(){
                    public int compare(Info o1, Info o2){
                        if(o1.score != o2.score){
                            return o1.score - o2.score;
                        }else{
                            return o1.index - o2.index;
                        }
                    }
                });
            }
            //列印資訊
            for(Info stu : list){
                System.out.println(stu.name + " " + stu.score);
            }
//            list.clear();//清空列表
        }
        scan.close();
    }

}

試題4:兩個非常大的數字相乘(相加,相減)
該題目在java中可以使用BigInteger類中的方法來實現。否則的話可以使用如下方式來實現。

大數相乘:假設有A和B兩個大數,位數分別為a和b。根據我們平常手動計算乘法的方式可以看出,
最終的結果的位數c一定小於等於a+b,我們可以舉一個簡單的例子來說明,99*999=98901,
最終結果是五位(a+b)。下面我們根據98*765 = 74970來看看結果中的每一位是怎麼得來的,
最後一位0是A的最後一位8和B的最後一位5的乘機除10取餘得到的,結果的倒數第二位7是A的倒數
第二位9和B的最後一位5的乘積45與A的最後一位8和B的倒數第二位6的乘積48之和93然後加上上一
位的進位4得到97然後在除10取餘得到的7……依次進行下去就可以得到最終結果。

下面來總結一下規律:A中的第i位與B的第j位之積最終會存放到結果的第i+j位中(i和j都是從後往前數),
所以我們可以先進行結果中每一位的計算,完成所有計算後在進行進位的計算。為了將i和j從0開始計算,
我們先將字串A和B進行逆轉,然後在進行計算的時候就可以從0開始了。
*
*
大數相加:和相乘是類似的,不同的地方只是result結果集的長度,其值為較長字串的長度加一。

*
*
大數相減:大數相減和大數相加類似,只是需要判斷正負
*
*
在上述的各中計算過程中有幾點需要說明:大數相加的時候沒有判斷數字的正負,如果都是正數,
那麼就可以按照正數相加來計算,如果是一正一負可以轉換成大整數相減,兩個負數可以先儲存符號,然後相加。

import java.util.Scanner;
public class BigNum {

    public static void main(String[] args) {
        while (true) {
            Scanner console = new Scanner(System.in);
            System.out.println("請輸入兩個以空格分隔的數字字串,數字由0-9構成:");
            String inputStr = console.nextLine();
            String[] str = inputStr.split(" ");
            String str1 = str[0];
            String str2 = str[1];
            String addOut = bigNumberAdd(str1,str2);
            System.out.println("加法:"+str1+"+"+str2+"="+addOut);
            bigNumberSub(str1, str2);
            bigNumberSimpleMulti(str1,str2);
        }
    }

    public static String bigNumberSub(String f, String s) {
        System.out.print("減法:" + f + "-" + s + "=");
        // 將字串翻轉並轉換成字元陣列
        char[] a = new StringBuffer(f).reverse().toString().toCharArray();
        char[] b = new StringBuffer(s).reverse().toString().toCharArray();
        int lenA = a.length;
        int lenB = b.length;
        // 找到最大長度
        int len = lenA > lenB ? lenA : lenB;
        int[] result = new int[len];
        // 表示結果的正負
        char sign = '+';
        // 判斷最終結果的正負
        if (lenA < lenB) {
            sign = '-';
        } else if (lenA == lenB) {
            int i = lenA - 1;
            while (i > 0 && a[i] == b[i]) {
                i--;
            }
            if (a[i] < b[i]) {
                sign = '-';
            }
        }
        // 計算結果集,如果最終結果為正,那麼就a-b否則的話就b-a
        for (int i = 0; i < len; i++) {
            int aint = i < lenA ? (a[i] - '0') : 0;
            int bint = i < lenB ? (b[i] - '0') : 0;
            if (sign == '+') {
                result[i] = aint - bint;
            } else {
                result[i] = bint - aint;
            }
        }
        // 如果結果集合中的某一位小於零,那麼就向前一位借一,然後將本位加上10。其實就相當於借位做減法
        for (int i = 0; i < result.length - 1; i++) {
            if (result[i] < 0) {
                result[i + 1] -= 1;
                result[i] += 10;
            }
        }

        StringBuffer sb = new StringBuffer();
        // 如果最終結果為負值,就將負號放在最前面,正號則不需要
        if (sign == '-') {
            sb.append('-');
        }
        // 判斷是否有前置0
        boolean flag = true;
        for (int i = len - 1; i >= 0; i--) {
            if (result[i] == 0 && flag) {
                continue;
            } else {
                flag = false;
            }
            sb.append(result[i]);
        }
        // 如果最終結果集合中沒有值,就說明是兩值相等,最終返回0
        if (sb.toString().equals("")) {
            sb.append("0");
        }
        // 返回值
        System.out.println(sb.toString());
        return sb.toString();
    }


    public static String bigNumberAdd(String f, String s) {
        //翻轉兩個字串,並轉換成陣列
        char[] a = new StringBuffer(f).reverse().toString().toCharArray();
        char[] b = new StringBuffer(s).reverse().toString().toCharArray();
        int lenA = a.length;
        int lenB = b.length;
        //計算兩個長字串中的較長字串的長度
        int len = lenA > lenB ? lenA : lenB;
        int[] result = new int[len + 1];
        for (int i = 0; i < len + 1; i++) {
            //如果當前的i超過了其中的一個,就用0代替,和另一個字元陣列中的數字相加
            int aint = i < lenA ? (a[i] - '0') : 0;
            int bint = i < lenB ? (b[i] - '0') : 0;
            result[i] = aint + bint;
        }
        //處理結果集合,如果大於10的就向前一位進位,本身進行除10取餘
        for (int i = 0; i < result.length; i++) {
            if (result[i] >= 10) {
                result[i + 1] += result[i] / 10;
                result[i] %= 10;
            }
        }
        StringBuffer sb = new StringBuffer();
        //該欄位用於標識是否有前置0,如果有就不要儲存
        boolean flag = true;
        for (int i = len; i >= 0; i--) {
            if (result[i] == 0 && flag) {
                continue;
            } else {
                flag = false;
            }
            sb.append(result[i]);
        }
        return sb.toString();
    }

    public static void bigNumberSimpleMulti(String f, String s) {
        System.out.print("乘法:" + f + "*" + s + "=");
        // 獲取首字元,判斷是否是符號位
        char signA = f.charAt(0);
        char signB = s.charAt(0);
        char sign = '+';
        if (signA == '+' || signA == '-') {
            sign = signA;
            f = f.substring(1);
        }
        if (signB == '+' || signB == '-') {
            if (sign == signB) {
                sign = '+';
            } else {
                sign = '-';
            }
            s = s.substring(1);
        }
        // 將大數翻轉並轉換成字元陣列
        char[] a = new StringBuffer(f).reverse().toString().toCharArray();
        char[] b = new StringBuffer(s).reverse().toString().toCharArray();
        int lenA = a.length;
        int lenB = b.length;
        // 計算最終的最大長度
        int len = lenA + lenB;
        int[] result = new int[len];
        // 計算結果集合
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < b.length; j++) {
                result[i + j] += (int) (a[i] - '0') * (int) (b[j] - '0');
            }
        }
        // 處理結果集合,如果是大於10的就向前一位進位,本身進行除10取餘
        for (int i = 0; i < result.length; i++) {
            if (result[i] > 10) {
                result[i + 1] += result[i] / 10;
                result[i] %= 10;
            }
        }
        StringBuffer sb = new StringBuffer();
        // 該欄位用於標識是否有前置0,如果是0就不需要列印或者儲存下來
        boolean flag = true;
        for (int i = len - 1; i >= 0; i--) {
            if (result[i] == 0 && flag) {
                continue;
            } else {
                flag = false;
            }
            sb.append(result[i]);
        }
        if (!sb.toString().equals("")) {
            if (sign == '-') {
                sb.insert(0, sign);
            }
        } else {
            sb.append(0);
        }
        // 返回最終結果
        System.out.println(sb.toString());
    }

}

試題5:字串分解
輸入m個字串 和一個整數n, 把字串M化成以N為單位的段,不足的位數用0補齊。

輸入
2
8
abc
abcdefgdhkfk
輸出
abc00000

abcdefgd
hkfk0000

public class DecompressExport {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);

        int m = cin.nextInt();
        int n = cin.nextInt();
        List<String> lists = new ArrayList<>();
        for (int i = 0; i < m; i++) {
            lists.add(i, cin.next());
        }
        for (String list : lists) {
            export(list, n);
        }
    }


    private static void export(String input, int n) {
        int len = input.length();
        int polish = len % n;
        if(polish!=0){
            for (int i = 0; i < n - polish; i++) {
                input = input + "0";
            }
        }
        int loop = input.length() / n;
        for (int i = 0; i < loop; i++) {
            System.out.println(input.substring(i*n, (i +1)* n));
        }
        System.out.println("\r\n");
    }
}

試題:括號合法性檢測
程式設計的時候,if條件裡面的“(”、“)”括號經常出現不匹配的情況導致編譯不過,
請編寫程式檢測輸入一行if語句中的圓括號是否匹配正確。
同時輸出語句中出現的左括號和右括號數量,
如if((a==1)&&(b==1))是正確的,
而if((a==1))&&(b==1))是錯誤的。
注意if語句的最外面至少有一對括號。提示:用堆疊來做。
輸入:if((a==1)&&(b==1))
輸出:RIGTH 3 3
輸入:if((a==1))&&(b==1))
輸出:WRONG 3 4

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

/**
 * 使用棧實現字串的括號匹配檢查。
 */
public class JudgeSymbolReg {

    public static void main(String[] args) throws IOException {
        while (true) {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String str = br.readLine();
            System.out.println(match(str));
        }
    }

    /**
     * 進行匹配的演算法。
     *
     * @param str 待檢查的字串。
     * @return boolean
     */
    public static boolean match(String str) {
        Stack stack = new Stack(); // 定義一個存放括號的棧。
        char[] ca = str.toCharArray(); // 將字串轉為字元陣列以便對其遍歷。
        stack.push((Character) ca[0]); // 首先將第一個字元壓入棧中。
        /*
         * 從第二個字元開始,依次與棧中字元匹配。
         * 成功則將棧頂元素彈出。
         * 失敗則將字元陣列中的當前字元壓入棧中。
         */
        for (int index = 1; index < ca.length; ++index) {
            if(stack.empty()){
                return false;//右括號先於左括號,則wrong
            }
            Character c1 = (Character) stack.peek();
            Character c2 = ca[index];
            if ((c1.equals('(') && c2.equals(')'))
                    || (c1.equals('[') && c2.equals(']'))) {
                stack.pop();
            } else {
                    stack.push(c2);
            }
        }
        return stack.empty();
    }
}

試題:過濾非首次出現字元
通過鍵盤輸入一串小寫字母(a~z)組成的字串。請編寫一個字串過濾程式,若字串中出現多個相同的字元,將非首次出現的字元過濾掉。
比如字串“abacacde”過濾結果為“abcde”。
要求實現函式:
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
【輸入】 pInputStr: 輸入字串
lInputLen: 輸入字串長度
【輸出】 pOutputStr: 輸出字串,空間已經開闢好,與輸入字串等長;

import java.util.Scanner;
public class FilterRep {
    public static  void main(String[] args){
        while (true){
            Scanner scanner = new Scanner(System.in);
            String a = scanner.next();
            String output = filterRep(a);
            System.out.println(output);
        }

    }
    public static String filterRep(String a){
        StringBuilder input  = new StringBuilder(a);
        for(int i = 0; i<input.length()-1;i++){
            for(int j = i+1 ;j<input.length();j++){
                if(input.charAt(i) == input.charAt(j)){
                    input.deleteCharAt(j);
                    j--;
                }
            }
        }
        return input.toString();
    }

}

試題:字串匹配
有字串”?^_^“,”?”與”“中間字元為主要匹配字元,”?”代表一個字元,而”*”可以當做0或任意數量字元。
對目標字串進行匹配,並輸出字串匹配成功的第一個字元的下標,字串的第一個字元下標為0。(我一開始沒注意到”?
“可以有N多個,白浪費功夫做一個”?”的匹配了)。
  例子:
  輸入:?^_^*
  abc^_^abc
  輸出:2

import java.util.Scanner;
public class TestMatch {
    public Integer firstMatchReg() {
        Scanner cin = new Scanner(System.in);
        System.out.println("請先輸入規則;回車換行後輸入匹配字串");
        String match = cin.next();
        String input = cin.next();
        String matchReg = match.substring(match.indexOf("?")+1,match.indexOf("*"));
        int index = input.indexOf(matchReg);
        if(index==0){
            index= input.indexOf(matchReg,1);
        }
        return index > 0 ? index - 1 : -1;
    }

    public static void main(String[] args) {
        TestMatch testMatch = new TestMatch();
        int output = testMatch.firstMatchReg();
        System.out.println(output);
    }
}

試題:地鐵換乘
描述:已知2條地鐵線路,其中A為環線,B為東西向線路,線路都是雙向的。經過的站點名分別如下,兩條線交叉的換乘點用T1、T2表示。
編寫程式,任意輸入兩個站點名稱,輸出乘坐地鐵最少需要經過的車站數量(含輸入的起點和終點,換乘站點只計算一次)。
地鐵線A(環線)經過車站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18
地鐵線B(直線)經過車站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15
輸入:輸入兩個不同的站名
輸出:輸出最少經過的站數,含輸入的起點和終點,換乘站點只計算一次
輸入樣例:A1 A3
輸出樣例:3

(注意:按照題示,A1 A3結果為3,所以A1 A1結果就應該為1,依此。)

Floyd演算法的基本思想如下:從任意節點A到任意節點B的最短路徑不外乎2種可能:
1、是直接從A到B,
2、是從A經過若干個節點X到B。
所以,我們假設dis(AB)為節點A到節點B的最短路徑的距離,對於每一個節點X,我們檢查dis(AX) + dis(XB) < dis(AB)是否成立,
如果成立,證明從A到X再到B的路徑比A直接到B的路徑短,我們便設定dis(AB)= dis(AX) +dis(XB),這樣一來,
當我們遍歷完所有節點X,dis(AB)中記錄的便是A到B的最短路徑的距離。

import java.util.Scanner;

public class Station {

    static String strA = "A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18";
    static String strB = "B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15";

    static String[] SA = strA.split(" ");
    static String[] SB = strB.split(" ");

    static int LENSA = SA.length;
    static int LENSB = SB.length;

    static int indexT1SA = getIndexofSA("T1");    //"T1"車站在A線路上的陣列下標
    static int indexT1SB = getIndexofSB("T1");    //"T1"車站在B線路上的陣列下標
    static int indexT2SA = getIndexofSA("T2");    //"T2"車站在A線路上的陣列下標
    static int indexT2SB = getIndexofSB("T2");    //"T2"車站在B線路上的陣列下標

    public static void main(String[] args) {

        int step = 0;
        System.out.println("請輸入\"始發站\"(空格)\"終到站\"(例如:A1 B4(回車結束)):");
        Scanner sc = new Scanner(System.in);
        String[] strArray = sc.nextLine().split(" ");

        String x = strArray[0].toUpperCase();
        String y = strArray[1].toUpperCase();

        System.out.println("go:"+x);
        System.out.println("to:"+y);

        sc.close();

        step = getMinStep(x, y) + 1;
        System.out.println("經過的最少車站數:"+step);
    }

    private static int getMinStep(String x, String y) {

        if(('A' != x.charAt(0))&&('A' != y.charAt(0)))
        {
            //在地鐵B線路上
            return min(stepBtoB(x, y), stepT1orT2(x, y));
        }
        else if(('B' != x.charAt(0))&&('B' != y.charAt(0)))
        {
            //在地鐵A線路上
            return min(stepAtoA(x, y), stepT1orT2(x, y));
        }
        else
        {
            //A到B,或者B到A
            return stepT1orT2(x, y);
        }
    }

    //從T1或者T2站換乘,s1到s2的最短距離
    private static int stepT1orT2(String s1, String s2) {
        int lenXtoT1 = steptoT1(s1);
        int lenXtoT2 = steptoT2(s1);
        int lenYtoT1 = steptoT1(s2);
        int lenYtoT2 = steptoT2(s2);

        int lineT1 = lenXtoT1 + lenYtoT1;
        int lineT2 = lenXtoT2 + lenYtoT2;

        return min(lineT1, lineT2);
    }

    //到T1的最短距離
    private static int steptoT1(String s) {

        if("T1".equals(s))
        {
            return 0;
        }
        else if("T2".equals(s))
        {
            return min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2"));
        }
        else if('A' == s.charAt(0))    //s是A線路上的車站
        {
            //找到s站在SA的下標
            int indexSSA = getIndexofSA(s);

            //不換乘,s到T1最短路程
            int line1 = min(mod(indexSSA, indexT1SA), LENSA-mod(indexSSA, indexT1SA));
            //不換乘,s到T2最短路程
            int line2 = min(mod(indexSSA, indexT2SA), LENSA-mod(indexSSA, indexT2SA));

            return min(line1, line2+min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2")));
        }
        else if('B' == s.charAt(0))    //s是B線路上的車站
        {
            //找到s站在SB的下標
            int indexSSB = getIndexofSB(s);

            //不換乘,s到T1最短路程
            int line1 = mod(indexSSB, indexT1SB);
            //不換乘,s到T2最短路程
            int line2 = mod(indexSSB, indexT2SB);

            return min(line1, line2+min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2")));
        }
        else
        {
            System.out.println("車站名有誤,請檢查!");
            return -1;
        }
    }

    //s到T2的最短距離
    private static int steptoT2(String s) {

        if("T2".equals(s))
        {
            return 0;
        }
        else if("T1".equals(s))
        {
            return min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2"));
        }
        else if('A' == s.charAt(0))    //s是A線路上的車站
        {
            //找到s站在SA的下標
            int indexSSA = getIndexofSA(s);

            //不換乘,s到T1最短路程
            int line1 = min(mod(indexSSA, indexT1SA), LENSA-mod(indexSSA, indexT1SA));
            //不換乘,s到T2最短路程
            int line2 = min(mod(indexSSA, indexT2SA), LENSA-mod(indexSSA, indexT2SA));

            return min(line2, line1+min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2")));
        }
        else if('B' == s.charAt(0))    //s是B線路上的車站
        {
            //找到s站在SB的下標
            int indexSSB = getIndexofSB(s);

            //不換乘,s到T1最短路程
            int line1 = mod(indexSSB, indexT1SB);
            //不換乘,s到T2最短路程
            int line2 = mod(indexSSB, indexT2SB);

            return min(line2, line1+min(stepAtoA("T1", "T2"), stepBtoB("T1", "T2")));
        }
        else
        {
            System.out.println("車站名有誤,請檢查!");
            return -1;
        }
    }

    //A到A,不換乘
    private static int stepAtoA(String s1, String s2) {
        if(('B' == s1.charAt(0))||('B' == s2.charAt(0)))
        {
            System.out.println("輸入不是A線路上的站點,請檢查!");
            return -1;
        }

        //找到s1站,在A線路上的陣列下標
        int indexS1SA = getIndexofSA(s1);

        //找到s2站,在A線路上的陣列下標
        int indexS2SA = getIndexofSA(s2);

        //不換乘,s1到s2的最短距離
        return min(mod(indexS1SA, indexS2SA), LENSA-mod(indexS1SA, indexS2SA));
    }

    //B到B,不換乘
    private static int stepBtoB(String s1, String s2) {
        if(('A' == s1.charAt(0))||('A' == s2.charAt(0)))
        {
            System.out.println("輸入不是B線路上的站點,請檢查!");
            return -1;
        }

        //找到s1站,在B線路上的陣列下標
        int indexS1SB = getIndexofSB(s1);

        //找到s2站,在B線路上的陣列下標
        int indexS2SB = getIndexofSB(s2);

        //不換乘,s1到s2的最短距離
        return mod(indexS1SB, indexS2SB);
    }

    private static int min(int a, int b)
    {
        return a<b?a:b;
    }

    private static int getIndexofSA(String str)
    {
        for(int index = 0; index < LENSA; index++)
        {
            if(str.equals(SA[index]))
            {
                return index;
            }
        }

        return -1;
    }

    private static int getIndexofSB(String str)
    {
        for(int index = 0; index < LENSB; index++)
        {
            if(str.equals(SB[index]))
            {
                return index;
            }
        }

        return -1;
    }

    private static int mod(int a, int b)
    {
        if(a < b)
        {
            return b-a;
        }
        else
        {
            return a-b;
        }
    }
}

試題:程式設計去掉字串中數字之後的重複字元
描述:
給定一個字串,該字串只包含數字和字母,其中包含有連續相同的數字和字母,要求一個數字(該數字不包括在內)之後如果有兩個或者以上重複的數字或者字母,則去掉一個重複的,其餘的保持原樣,非數字之後的重複字元保持原樣輸出。
題目類別: 字串,棧,查詢
難度: 中級
分數:
執行時間限制: 無限制
記憶體限制: 無限制
階段: 應聘考試
輸入:
字串,只包含數字和字母,長度在1-100.
輸出:
數字之後如果有重複的數字或者字母,則去掉一個重複的,其餘的保持原樣,非數字之後的重複字元保持原樣輸出。
樣例輸入:
33333zzhhhhaaa44455pppin
樣例輸出:
3333zhhhhaaa445ppin

import java.util.*;
public class SplitRep {
    public static Character chaStatic;//用於存放倒數第二個元素

    public static void main(String[] args) {
        while (true) {
            Scanner scanner = new Scanner(System.in);
            String input = scanner.next();
            String output = splitRep(input);
            System.out.println(output);
        }
    }

    private static String splitRep(String input) {
        Stack<Character> tmpStack = new Stack<Character>(); // 定義一個存放輸入的棧
        char[] ca = input.toCharArray(); // 將字串轉為字元陣列以便對其遍歷。
        //========長度小於等於2則直接輸出==========//
        if (ca.length <= 2) {
            return input;
        }
        //把資料都放入臨時棧中
        for (int i = ca.length - 1; i >= 0; i--) {
            tmpStack.push(ca[i]);
        }

        Stack<Character> finalStack = new Stack<Character>();//用於儲存輸出資料的棧

        boolean isNumLast = false;
        boolean isNum;
        int sameCount = 1;
        int lastNum = 20;
        Character curChar = (Character) tmpStack.peek();
        if (curChar > '0' && curChar < '9') {
            isNumLast = true;
            lastNum = curChar;
        }
        Character nextChar;
        finalStack.push(curChar);//推入第一個元素
        while (!tmpStack.empty()) {//棧不為空,則有元素,繼續執行。以下邏輯略複雜,可以轉化為陣列處理。
            curChar = (Character) tmpStack.pop();
            if (tmpStack.empty()) { //元素結束,判斷上一字元是數字,並且最後一個字元和前一字元相等,則移除一位