1. 程式人生 > >華為 2016實習生 上機考試 題目

華為 2016實習生 上機考試 題目

昨天剛參加上機考試,在兩個小時的考試時間內有的牛人30分鐘就完成考試。題目貌似比較簡單,不過呵呵,我就來當攢經驗了。下面的參考答案有錯誤的地方還望指正,或者有更好的演算法也請大家多多分享。

考試用程式設計工具VS2005及JDK1.7,考試型別涉及陣列、連結串列、指標、字串、迴圈、列舉、排序等等。考試語言C/C++或JAVA。

第一題:字串去掉重複的字元(100分)

描述:
執行時間限制
記憶體限制:

濾除輸入字串中的重複出現的字元,只保留第一個

10 Sec

無限制

輸入: 字串,長度小於1000
輸出:

字串

樣例輸入: 12222aab2
樣例輸出:
12ab
參考答案:
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String text = input.nextLine();
        System.out.print(filter(text));  input.close();
    }
    public static String filter(String s){
        String result =  " ";
        int len = s.length();
        if(len<1000) {
            char[] ch = s.toCharArray();
            for (int i = 0; i < len; i++) {
                char temp = ch[i];
                boolean repeat = false;
                for (int j = 0; j < result.length(); j++) {
                    if (temp == result.charAt(j))
                        repeat = true;
                }
                if(!repeat){
                    result += temp;
                }
            }
        }else
            result = "The string is too long!!!";
        return result.trim();
    }
}
利用正則表示式去重
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String text = input.nextLine();
        System.out.print(filter(text));  input.close();
    }
    public static String filter(String s){
        String result =  "";
        int len = s.length();
        if(len<1000) {
            /*
            正則項解釋:(?s)開啟單行模式 DOTALL,讓.號匹配任意字元
                        (.) 任意字元  並捕獲在第一組
                        (?=.*\1)  這是斷言, 表示後面內容將是 任意個字元加上第一組所捕獲的內容
                        這樣子,如果這整個式子匹配到,表示第一個捕獲組內容在字串中至少出現兩次,替換為 "" 空串
                        如“12222aab12”最後為“ab12”,即保留後出現的字元
             因此需要對字串在過濾前反轉,過濾後再反轉回來。
             */
            result = new StringBuilder(s).reverse().toString();
            result = result.replaceAll("(?s)(.)(?=.*\\1)", "");
            result = new StringBuilder(result).reverse().toString();
        }else
            result = "The string is too long!!!";
        return result;
    }
}
利用LinkedHashSet的不包含重複元素以及對保留元素插入順序的特性,過濾重複字串
import java.util.LinkedHashSet;
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String text = input.nextLine();
        System.out.print(filter(text));   input.close();
    }
    public static String filter(String s){
        String result =  "";
        LinkedHashSet<String> temp = new LinkedHashSet<String>();
        int len = s.length();
        if(len<1000) {
            for(int i=0;i<s.length();i++){
                temp.add(""+s.charAt(i));
            }
            for(String ch :temp){
                result += ch;
            }
        }else
            result = "The string is too long!!!";
        return result;
    }
}

第二題:簡單的均值濾波演算法(200分)
描述:






執行時間限制
記憶體限制:

計算機在對模擬訊號進行資料採集時,經常會收到干擾,導致讀取的資料發生突變,這時就需要對採集的資料做特殊處理,保證資料是可靠的,該題目模擬對電池電壓的資料採集,限定條件如下:

1)電池電壓的有效範圍為【3300-4200】,包括3300和4200,無效值在計算時要丟棄。

2)輸入為10 組電池電壓,包括有效值和無效值,每五組有效值去一次平均值,作為最終輸出值,有效值不夠五組不輸出;

3)輸出格式:“有效電壓組數 平均值1 平均值2”,平均值有幾組輸出幾組,沒有的話不輸出,“有效電壓組數”必須輸出;

4)計算直接採用整形數值即可,不考慮浮點數;

5)除最終輸出外,中間不要有任何的I/O資料輸出;

無限制

無限制

輸入: 10組電壓值,為整形資料
輸出: 輸出格式:“有效電壓組數 平均值1 平均值2”,平均值有幾組輸出幾組,沒有的話不輸出,“有效電壓組數”必須輸出
樣例輸入: 3500 3500 3400 3500 3600 4100 4100 4100 4100 4100
樣例輸出: 2 3500 4100
參考答案:
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int[] voltage = new int[10];
        int num = 0;
        while(input.hasNext()){
            int temp = input.nextInt();
            voltage[num] = temp;
            num++;
            if(num>9)break;
        }
        input.close();
        int[] validVoltage = new int[10];
        int num1 =0;
        for(int i=0;i<voltage.length;i++){
            if(voltage[i]>3299 && voltage[i]<4201){
                validVoltage[num1] = voltage[i];
                num1++;
            }
        }
        if(num1<4){
            System.out.print("0");
        }else if (num1<9){
            int sum = 0;
            for (int i=0;i<5;i++){
                sum += validVoltage[i];
            }
            System.out.print("1 "+ sum/5);
        }else{
            int sum1 = 0,sum2 = 0;
            for (int i=0;i<5;i++){
                sum1 += validVoltage[i];
            }
            for (int i=5;i<10;i++){
                sum2 += validVoltage[i];
            }
            System.out.print("2 "+sum1/5+" "+sum2/5);
        }
    }
}

第三題:大數求餘(300分)
描述:
執行時間限制
記憶體限制:

輸入兩個超長整型構成的字串,其間使用一個空格分隔,每個字串最大長度為100個字元。求第一個整數除以第二個整數以後的餘數

無限制

無限制

輸入: 輸入兩個以空格分隔的字串,輸入的每個字串的最大長度是100個字元。
輸出:

輸出為兩個字串相除以後的餘數。如果異常,輸出null。

樣例輸入: 123456789 23456789
樣例輸出:
6172844

參考答案:

import java.math.BigInteger;
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        try {
            BigInteger bi1 = input.nextBigInteger();
            BigInteger bi2 = input.nextBigInteger();
            BigInteger bi3 ;
            bi3 = bi1.remainder(bi2);
            System.out.print(bi3);
        }catch (Exception ex){
            System.out.print("null");
        }
        input.close();
    }
}
當然此題的本意肯定不會這麼簡單,另外解法:

原理:利用被除數減去除數,直到剩餘的資料小於被除數,此時的結果就是餘數。

import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        try{
            String s1 = input.next();
            String s2 = input.next();
            int n1 = s1.length();
            int n2 = s2.length();
            //將大數存為陣列
            int[] int1=new int[n1];
            for(int i=n1-1,k=0;i>=0&&k<n1;i--,k++){ //被除數,個位數的下標為0
                int1[i]=Integer.parseInt(s1.substring(k,k+1));
            }
            int[] int2=new int[n2];//除數
            for(int i=n2-1,k=0;i>=0&&k<n2;i--,k++){
                int2[i]=Integer.parseInt(s2.substring(k,k+1));
            }
            int[] int3=new int[n1];//存放餘數
            if(!isdelable(int1, int2)){//判斷是否可以被除
                System.out.print(s1);
            }else{
                int3=delete(int1, int2);
                while(isdelable(int3, int2)){
                    //delete(s3,s2);
                    int3=delete(int3, int2);
                }
                if(int3.length==0){
                    System.out.println(0);
                }else{
                    for(int i=int3.length-1;i>=0;i--){
                        System.out.print(int3[i]);
                    }
                }
            }
            input.close();
        }catch(Exception ex){
            System.out.println("null");
            ex.printStackTrace();
        }
    }
    //delete函式用來實現兩個僅包含數字的字串相減
    static int[] delete(int[] int1,int[] int2){
        int n1=int1.length;
        int n2=int2.length;
        int[] int3=new int[n1];//與被除數長度相等
        for(int i=0;i<n2;i++){//將除數對被除數對齊
            int3[i]=int2[i];
        }
        for(int i=0;i<n1;i++){
            if(int1[i]>=int3[i]){
                int1[i]=int1[i]-int3[i];
            }else{
                int1[i]=int1[i]+10-int3[i];
                int1[i+1]--;
            }
        }
        int k=0;//統計減後被除數高位為空的個數
        for(int i=n1-1;i>=0;i--){
            if(int1[i]==0){
                k++;
            }else
                break;
        }
        int[] int4=new int[n1-k];
        for(int i=n1-k-1;i>=0;i--){
            int4[i]=int1[i];
        }
        return int4;
    }
    //isdelable用來判斷是否仍然可以繼續執行減法
    static boolean isdelable(int[] int1,int[] int2){
        boolean b=false;
        int n1=int1.length;
        int n2=int2.length;
        if(n1<n2){ //被除數小於除數
            b=false;
        }else if(n1==n2){//除數與被除數長度相等,如果被除數大則返回true,否則false
            int i=n1-1;
            while(i>0&&int1[i]==int2[i]){
                i--;
            }
            if(int1[i]<int2[i]){
                b=false;
            }else{
                b=true;
            }
        }else{//被除數長度大於除數
            b=true;
        }
        return b;
    }
}