華為筆試題

2021-10-06 10:51:10 字數 4075 閱讀 5789

輸入描述:

輸入乙個字串,字串中包含了全量字符集和已占用字符集,兩個字符集用@相連。@前的字符集合為全量字符集,@後的字符集為已占用字元集合。已占用字符集中的字元一定是全量字符集中的字元。字符集中的字元跟字元之間使用英文逗號分隔。字符集中的字元表示為字元加數字,字元跟數字使用英文冒號分隔,比如a:1,表示1個a字元。字元只考慮英文本母,區分大小寫,數字只考慮正整形,數量不超過100,如果乙個字元都沒被占用,@識別符號仍在,例如a:3,b:5,c:2@

輸出描述:

可用字符集。輸出帶回車換行。

示例1:

輸入:a:3,b:5,c:2@a:1,b:2

輸出:a:2,b:3,c:2

說明:全量字符集為3個a,5個b,2個c。已占用字符集為1個a,2個b。由於已占用字符集不能再使用,因此,剩餘可用字元為2個a,3個b,2個c。因此輸出a:2,b:3,c:2。注意,輸出的字元順序要跟輸入一致。不能輸出b:3,a:2,c:2。如果某個字元已全被占用,不需要輸出。例如a:3,b:5,c:2@a:3,b:2,輸出為b:3,c:2。

用正規表示式分割。

#include using namespace std;

int main()

}for(sregex_token_iterator it(used.begin(), used.end(), re), end; it != end; it++)

}for (int j = 0; j < input.size(); ++j)

}return 0;

}

題目描述:

常用的邏輯計算有and(表示為&);or(表示為|);not(表示為!)。其中,他們的優先順序關係是not(!)>and(&)>or(|)。

輸入描述:

1、測試用例中間無空格,無需考慮空格。

2、測試用例表示式只會出現如下字元:「0」,「1」,「(」,「)」,「&」,「|」,「!」。

3、測試用例所給的輸入都是合法輸入,無需要考慮非法輸入。

4、測試用例長度不會超過128個字元。

5、括號可以重複巢狀。

例如:1 | ( 1 & 0 )                       返回值:1

1 & 0 | 0 & 1                     返回值:0

! 0 & 1 | 0                          返回值:1

( ( ! 0 & 1 ) ) | 0                 返回值:1

輸出描述:

輸出邏輯運算後的最終結果:0或者1

示例1:

輸入:! ( 1 & 0 ) | 0 & 1

輸出:1

示例2:

輸入:! ( 1 & 0 ) & 0 | 0

輸出:0

中綴轉字尾,再用字尾表示式求值。

(1) 中綴轉字尾的步驟:使用棧儲存運算子,預定義運算子的優先順序。然後,遍歷中綴表示式:

(a) 如果是左括號,壓棧;

(b) 如果是右括號,直到棧頂是左括號為止,持續出棧,附到字尾表示式後面。之後,將左括號出棧。

(c) 如果是運算子,從棧頂將所有優先順序大於等於當前的運算子持續出棧,直到棧頂運算子優先順序小於當前運算子為止。之後,將當前運算子壓棧。

(d) 如果是運算元,直接附到字尾表示式的後面。

最後,直到棧為空為止,持續出棧,附到字尾表示式後面。

(2) 使用字尾表示式求值相比之下就很簡單,使用棧儲存運算元,當遍歷到運算子時,取出棧頂的1個或者2個元素進行運算,將結果壓棧。最後,棧中剩下的那乙個值就是運算結果。

#include using namespace std;

//中綴轉字尾

void convert(string& in, string& post)

op.pop();

}else if(c == '&' || c == '|' || c == '!')

op.push(c);

}else if(isdigit(c)) post += c;

}while(!op.empty())

}//使用字尾表示式計算

char calc(string& post)

else if(c == '&')

else if(c == '|')

}return st.top() ? '1' : '0';

}int main()

return 0;

}

同樣是中綴轉字尾的做法,但是要注意'-'的處理,如果是做負號用,需要變成減法的形式。

對於比較弱的資料,'-'作負號用時只出現在首位或者'('的後面,所以只需要判斷下'-'是否是在首位,或者'('的後面,如果是就變成"0-"即可。

//先把括號換掉

for(char& c : str)

') c = ')';

}//處理負號

string tmp;

int i = 0, n = str.size();

while(i < n)

else tmp += str[i++];

}else tmp += str[i++];

}

對於比較強的資料,如2*-(2*3+(6+3)*5)這種,就要嚴謹的判斷負號作用的起點和終點,然後變成"(0-...)"的形式:

(1) 首先判斷是否是負號:當'-'前面為空,或者前面的字元不是數字,就是負號

(2) 然後判斷負號作用的起點和終點:如果'-'後面的字元是數字,那麼'-'的作用範圍就是後面的連續數字字串。否則,'-'的後面是'(',那麼要一直往後統計左括號和右括號的個數,直到二者匹配,說明括號匹配結束,找到了'-'的作用範圍。

//先把括號換掉

for(char& c : str)

') c = ')';

}//處理負號

string tmp;

int i = 0, j = 0, n = str.size();

while(i < n)

else if(i + 1 < n && str[i+1] == '(')

else if(str[j] == '(') leftcnt++;

j++;

}//[i+1...j]

tmp += "(0-" + str.substr(i+1, j - i);

i = j;

}else i++;

}else tmp += str[i++];

}else tmp += str[i++];

}

總體**:資料較弱,不需要複雜的判斷'-'的方法。

#include using namespace std;

int priority[128] = ;

vectorintopost(const string& in)

else if(in[i] == ')')

op.pop();

i++;

}else if(isdigit(in[i]))

else

op.push(in[i++]);}}

while(!op.empty())

return ans;

}int calc(const vector& postorder)

}return st.top();

}int main()') c = ')';

}//處理負號

string tmp;

int i = 0, n = str.size();

while(i < n)

else tmp += str[i++];

}else tmp += str[i++];

}printf("%d\n", calc(intopost(tmp)));

}return 0;

}

華為筆試題

int a nsize 其中隱藏著若干 0,其餘非 0整數,寫乙個函式 int func int a,int nsize 使a 把0移至後面,非 0整數移至 陣列前面並保持有序,返回值為原資料中第乙個元素為0 的下標。盡可能不使用輔助空間且考慮效率及異常問題,注釋規範且給出設計思路 include ...

華為筆試題

某軟體需要實現建議的cd key演算法,輸入3個正整數,以空格隔開,根據這3個整數生成cd key字串,輸出格式 x x x xxyy,包括16個字元,以短劃線分開,其中,cd key最後兩個yy是用於cd key的自校驗,確保cd key本身是合法的。cdkey使用的字元表23456789abcd...

筆試題 2020華為筆試

i j k p,0測試用例 120,3 12,1 題目描述 乙個矩陣,5 5,取相鄰 二個成員有乙個邊是相同的 的6個,輸入乙個6個成員列表,判斷是否滿足?矩陣成員如下 1,2,3,4,5 11,12,13,14,15 21,22,23,24,25 31,32,33,34,35 41,42,43,4...