2017華為筆試題2

頭像是我偶像發表於2017-08-24

這是20170823這一場,整體來說還是比較簡單的。

一、寫一個轉換字串的函式

1.1 題目描述

將輸入字串中下標為偶數的字元連成一個新的字串輸出,需要注意兩點:
1. 如果輸入字串的長度超過20,則轉換失敗,返回“ERROR!”字串;
2. 輸入字串只能由0-9數字,小寫a-z和大寫A-Z組成,如果包含其他字元,則轉換失敗,返回“ERROR!”字串。

1.2 程式碼實現

public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine();
        if(string.length()>20){
            System.out.print("ERROR!");
            return;
        }
        char[] str = string.toCharArray();
        char[] output = new char[(str.length+1)/2];
        ConvertStr(str, output);
        for (int i = 0; i < output.length; i++) {
            System.out.print(output[i]);
        }
    }

    public static void ConvertStr(char[] str,char[] output){
        for(int i=0;i<str.length;i++){
            if(!isValid(str[i])){
                System.out.println("ERROR!");
            }
            if(i%2==0){
                output[i/2] = str[i];
            }
        }
    }

    public static boolean isValid(char c){
        Character character = c;
        return (character.isAlphabetic(c)||character.isDigit(c));
    }

二、給定一個正整數,給出消除重複數字以後最大的整數

2.1 題目描述

給定一個正整數,給出消除重複數字以後最大的整數,注意需要考慮長整數。

  • 輸入示例:423234
  • 輸出示例:432

2.2 程式碼實現

//第二題
    public static void solve2(String s){
        char[] a = new char[10];
        StringBuilder sbBuilder = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            int index = s.charAt(i)-'0';
            if(a[index]==0){
                a[index] = 1;
                sbBuilder.append(s.charAt(i));
            }else if(a[index]==1){//如果這個數字已經存在,則取其中大的數儲存
                StringBuilder string = new StringBuilder(sbBuilder.toString());
                long m = Long.parseLong(string.toString());
                int temp = string.indexOf(index+"");
                string = string.deleteCharAt(temp);
                string.append(s.charAt(i));
                long n = Long.parseLong(string.toString());
                //System.out.println("m:"+m+",n:"+n);
                if(m<n){
                    sbBuilder = string;
                }
            }
        }
        System.out.print(sbBuilder.toString());
    }

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine();
        solve2(string);
    }

三、實現2-62進位制任意兩種進位制之間的轉換

3.1 題目描述

將一個處於Integer型別聚會範圍內的整數從指定源進位制轉換成指定目標進位制;可指定的進位制值範圍為[2-62];每個數字的可聚會範圍為[0-9a-zA-Z];輸出字串的每一個都須為有效值,反例:”012”的百位字元為無效值,實現時無需考慮非法輸入。

  • 輸入描述:源進位制 目標進位制 待轉換的整數值
  • 輸入示例:8 16 12345670
  • 輸出示例:29cbb8

3.2 題目分析

  1. 先將進位制值與字元值、字元值與進位制值之間的轉換函式寫好;
  2. 兩種進位制之間的轉換,一般是先將源進位制轉換成十進位制,然後再轉換成新進位制;
  3. 另外需要注意輸出是否為有效值。

3.3 程式碼實現

由於本人能力有限,寫出的程式碼只能通過65%,希望大家有全通過的程式碼,可以分享一下,大家共同進步。

public static int toInt(char c){//將字元值轉換成進位制值
        int result = 0;
        if(c>='0'&&c<='9'){
            result = c-'0';
        }else if(c>='a'&&c<='z'){
            result = c-'a'+10;
        }else if(c>='A'&&c<='Z'){
            result = c-'A'+36;
        }
        return result;
    }
    public static char toChar(int i){//將進位制值轉換成字元值
        int result = 0;
        if(i<=9){
            result = i+48;
        }else if(i<=35){
            result = i+87;
        }else if(i<=61){
            result = i+29;
        }
        return (char) result;
    }
    public static String toTen(String s,int o){//將原進位制轉換成十進位制
        char[] array = s.toCharArray();
        Long sum = 0l;
        for (int i = 0; i < array.length; i++) {
            //System.out.print(toInt(array[array.length-1-i])+" ");
            sum = (long) (sum+(toInt(array[array.length-1-i]))*Math.pow(o, i));
        }
        String result = sum+"";
        return result;
    }
    public static String toNew(String s,int n){//將十進位制轉換成新進位制
        Long num = Long.parseLong(s);
        StringBuilder sBuilder = new StringBuilder();
        StringBuilder result = new StringBuilder();
        while(num>0){
            int temp = (int) (num%n);
            sBuilder.append(toChar(temp));
            num = num/n;
        }
        byte flag = 0;
        for (int i = 0; i < sBuilder.length(); i++) {
            if(flag==0&&sBuilder.charAt(sBuilder.length()-1-i)=='0'){
                break;
            }else{
                flag=1;
                result.append(sBuilder.charAt(sBuilder.length()-1-i));
            }
        }
        return result.toString();
    }

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int o = scanner.nextInt();
        int n = scanner.nextInt();
        String num = scanner.next();
        String string = toTen(num, o);
        //System.out.println(string);
        string = toNew(string, n);
        System.out.println(string);
    }

提示:大家應該注意到題目中的Integer型別,需要考慮負整數的情況,之前就是因為沒有考慮負整數的,所以只通過65%。

相關文章