2014屆華爲校園招聘機試題(java實現)

首先要感謝, 博主Hackbuteer1。提供的關於2014年的華爲面試題目。這裏運行環境是windows7,eclipse.jdk爲1.8.0_45。好了直接上題目、代碼,及分析。

一、題目描述(60分):
通過鍵盤輸入一串小寫字母(a~z)組成的字符串。請編寫一個字符串過濾程序,若字符串中出現多個相同的字符,將非首次出現的字符過濾掉。
比如字符串“abacacde”過濾結果爲“abcde”。

要求實現函數:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);

【輸入】 pInputStr: 輸入字符串
lInputLen: 輸入字符串長度
【輸出】 pOutputStr: 輸出字符串,空間已經開闢好,與輸入字符串等長;

【注意】只需要完成該函數功能算法,中間不需要有任何IO的輸入輸出

示例
輸入:“deefd” 輸出:“def”
輸入:“afafafaf” 輸出:“af”
輸入:“pppppppp” 輸出:“p”

main函數已經隱藏,這裏保留給用戶的測試入口,在這裏測試你的實現函數,可以調用printf打印輸出
當前你可以使用其他方法測試,只要保證最終程序能正確執行即可,該函數實現可以任意修改,但是不要改變函數原型。一定要保證編譯運行不受影響。

二、題目描述(40分):
通過鍵盤輸入一串小寫字母(a~z)組成的字符串。請編寫一個字符串壓縮程序,將字符串中連續出席的重複字母進行壓縮,並輸出壓縮後的字符串。
壓縮規則:
1、僅壓縮連續重複出現的字符。比如字符串”abcbc”由於無連續重複字符,壓縮後的字符串還是”abcbc”。
2、壓縮字段的格式爲”字符重複的次數+字符”。例如:字符串”xxxyyyyyyz”壓縮後就成爲”3x6yz”。

要求實現函數:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);

【輸入】 pInputStr: 輸入字符串
lInputLen: 輸入字符串長度
【輸出】 pOutputStr: 輸出字符串,空間已經開闢好,與輸入字符串等長;

【注意】只需要完成該函數功能算法,中間不需要有任何IO的輸入輸出

示例
輸入:“cccddecc” 輸出:“3c2de2c”
輸入:“adef” 輸出:“adef”
輸入:“pppppppp” 輸出:“8p”

三、題目描述(50分):
通過鍵盤輸入100以內正整數的加、減運算式,請編寫一個程序輸出運算結果字符串。
輸入字符串的格式爲:“操作數1 運算符 操作數2”,“操作數”與“運算符”之間以一個空格隔開。

補充說明:
1、操作數爲正整數,不需要考慮計算結果溢出的情況。
2、若輸入算式格式錯誤,輸出結果爲“0”。

要求實現函數:
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);

【輸入】 pInputStr: 輸入字符串
lInputLen: 輸入字符串長度
【輸出】 pOutputStr: 輸出字符串,空間已經開闢好,與輸入字符串等長;

【注意】只需要完成該函數功能算法,中間不需要有任何IO的輸入輸出

示例
輸入:“4 + 7” 輸出:“11”
輸入:“4 - 7” 輸出:“-3”
輸入:“9 ++ 7” 輸出:“0” 注:格式錯誤

/**
 * @author ziling
 *
 2015年8月7日
 */
public class StringFilter2014 {

    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        while(true){
//          String s = sca.next();
            //stringFilter(s)
//          System.out.println(hashFilter(s));
//          System.out.println(stringZip(s));
            String opNum = sca.next();
            String operator = sca.next();
            String opNum2 = sca.next();
            System.out.println(opNum + operator + opNum2);
            int judge =inputJudge(opNum, operator, opNum2);
//          System.out.println();

            if(judge == 1){
                if(operator.equals("+")){
                    System.out.println(temp1 + temp2); 
                }else System.out.println(temp1 - temp2);
            }
        }

    }
    public static int temp1, temp2;
    public static int inputJudge(String num1, String operator, String num2){

        try{
            temp1 = Integer.parseInt(num1);
            temp2 = Integer.parseInt(num2);
        }catch (Exception e){
            return -1;
        }

        if(!(operator.equals("+") || operator.equals("-"))){
            return -1;
        }else 
        return 1;
    }
    //這裏的時間複雜度是n*n,空間複雜度是O(1);當然還可以採用哈希方法,映射到數組中,然後查詢看看是否有,時間複雜哦度是n,空間複雜度是常數。
    public static String stringFilter(String s){
        int length = s.length();
        String result="";
        char[]c = s.toCharArray();
        for(int i = 0; i<length; i++){
            char temp = c[i];
            for(int j = i+1; j<length; j++){
                if(temp == c[j]){
                    c[j]=c[length-1];
                    length--;
                }
            }

        }
        //數組直接向前複製
        for(int i = 0; i<length; i++){
            result+=c[i];
        }
        return result;
    }
//題目1的解題部分。
/*(1)這裏java的char類型是16bits的,而c++是8位。注意區分。java的基本類型中有char和int兩類,其實是int的精度高於char,char本質上也是一種數。
     * 只是採用的編碼方式不同罷了。
     * 這裏忍不住要說兩句,本題的思想。首先是用hash來映射。直接保存第一次出現的字母。哈希函數爲 字符串中的字符-'a';
     * 修改於2015-09-09
     * */
    public static String hashFilter(String s){
        StringBuilder sb = new StringBuilder();
        int [] a = new int [26];
        Arrays.fill(a, 0);
        for(char c:s.toCharArray()){
            int index = c-'a';
            if(0 == hash[index]){
                hash[index] = 1;
                sb.append(c);
            }
        }
        return sb.toString();
    }

    public static String stringZip(String s){
        StringBuilder sb = new StringBuilder();
        int temp=1;
        for(int i = 0; i<s.length()-1; i++){
            char c = s.charAt(i);
            if(c == s.charAt(i+1)){
                temp ++;
                if((i+1) ==s.length()-1){
                    sb.append(temp);
                    sb.append(c);
                }
            }else if(c !=s.charAt(i+1)){
                if( temp >1){
                    sb.append(temp);
                    sb.append(c);
                    temp =1;
                }else if((i+1) != s.length()-1){
                    sb.append(c);
                }else {
                    sb.append(c);
                    sb.append(s.charAt(i+1));
                }
            }
        }

        return sb.toString();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章