首先要感謝, 博主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();
}
}