華為機試題刷題總結

發表於2022-02-20

總體來說,最近一年的題,難易程度簡單偏中等。

題總共分為五大類,分別是字元,排序,查詢,演算法題,其中二叉樹單獨拿出來考的

難易程度:百分之80屬於簡單題的範疇,剩下的屬於運氣題——————————。

一.字串

經常考的題有:(字串比較,字串拼接,字串排序,是否為公共子串,字串翻轉,字串重排;)

字串類的題就直接用map函式就行,剩下的百分之2.5的題用for迴圈輸出結果就可以;

二.排序類

經常考的題有:(K個字母組合,問第幾個字元或者數字,小朋友按照身高體重排序;)

三.查詢類

經常考的題有:(查詢中位數,小朋友查詢身高體重;)

四.演算法題(BFS,DFS;)

經常考的題有:(對角線上人數,迷宮,最優規劃,揹包問題;)

上面是幾類高頻的考試內容,以下是考試常用的幾個函式 **

1.getline 函式,此函式可讀取整行,包括前導和嵌入的空格,並將其儲存在字串物件中。

當 cin 讀取資料時,一旦它接觸到第一個非空格字元即開始閱讀,當它讀取到下一個空白字元時,它將停止讀取。

getline(cin, inputLine);   舉例: getline(cin, name);

2.sort函式,包含在標頭檔案為#include的c++標準庫中,呼叫標準庫裡的排序方法可以實現對資料的排序。

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp); 
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a,int b);
main(){
  //sort函式第三個引數自己定義,實現從大到小
  int a[]={45,12,34,77,90,11,2,4,5,55};
  sort(a,a+10,cmp);
  for(int i=0;i<10;i++)
    cout<<a[i]<<" ";
}
//自定義函式
bool cmp(int a,int b){
  return a>b;
}

3.substr函式,返回一個string,包含s中從pos開始的n個字元的拷貝(pos的預設值是0,n的預設值是s.size() - pos,即不加引數會預設拷貝整個s)

#include<string>
#include<iostream>
using` `namespace` `std;
int` `main()
{
  string s(``"12345asdf"``);
  string a = s.substr(0,5);   ``//獲得字串s中從第0位開始的長度為5的字串
  cout << a << endl;
}

4.atoi函式,轉化的是char[],c++標準庫中字串轉化為int的函式。

int i_dec = std::stoi (str_dec,&sz);  
int i_hex = std::stoi (str_hex,nullptr,16);  
int i_bin = std::stoi (str_bin,nullptr,2);  
int i_auto = std::stoi (str_auto,nullptr,0);   
std::cout << str_dec << ": " << i_dec << " and [" << str_dec.substr(sz) << "]\n";  
std::cout << str_hex << ": " << i_hex << '\n';  
std::cout << str_bin << ": " << i_bin << '\n';  
std::cout << str_auto << ": " << i_auto << '\n'

5.c_str()。標準庫的string類成員函式,從一個string得到c型別的字元陣列

#include <iostream>
//需要包含cstring的字串
#include <cstring>
using namespace std;
 
int main()
{
    //string-->char*
    //c_str()函式返回一個指向正規C字串的指標, 內容與本string串相同
 
    //這個陣列的資料是臨時的,當有一個改變這些資料的成員函式被呼叫後,其中的資料就會失效。
    //因此要麼現用先轉換,要麼把它的資料複製到使用者自己可以管理的記憶體中
    const char *c;
    string s = "1234";
    c = s.c_str();
    cout<<c<<endl;
    s = "abcde";
    cout<<c<<endl;
}

6.sscanf,sscanf()函式用於從字串中讀取指定格式的資料, int sscanf (char *str, char * format [, argument, ...]);引數str為要讀取資料的字串;format為使用者指定的格式;argument為變數,用來儲存讀取到的資料。

成功則返回引數數目,失敗則返回-1,錯誤原因存於errno 中。

sscanf()會將引數str 的字串根據引數format(格式化字串)來轉換並格式化資料(格式化字串請參考scanf()), 轉換後的結果存於對應的變數中。

sscanf()與scanf()類似,都是用於輸入的,只是scanf()以鍵盤(stdin)為輸入源,sscanf()以固定字串為輸入源。

#include <stdio.h>
int main(void)
{
    char str[100] ="123568qwerSDDAE";
    char lowercase[100];
    int num;
    sscanf(str,"%d %[a-z]", &num, lowercase);
    printf("The number is: %d.\n", num);
    printf("The lowercase is: %s.", lowercase);
    return 0;
}

常考的遍歷方法:

dfs和bfs

遞迴和動態規劃的區別

相同點:
遞迴與動態規劃是兩個十分基本的演算法,它們使用的思路都是分而治之,將一個大問題拆解成一個小問題。

不同點:
1.遞迴是從上而下(從大問題到小問題),而動態規劃是由下而上(先解決小問題最後到大問題);
2.動態規劃會儲存每個小問題的結果,從而它的計算速度會比遞迴要快。(代價是動態規劃的空間複雜度更高,即用空間換取的時間)。
3.動態規劃是用遞迴實現的,遞迴是用函式實現的。

————————————分割線—————————————

需要學習知識點的題

5.寫出一個程式,接受一個十六進位制的數,輸出該數值的十進位制表示。

#include<iostream>
using namespace std;
int main(){
    string a;
    while(getline(cin,a)){
        int res=0;
        int pos=a.find('x');
        for(int i=pos+1;i<a.size();++i){
            int tmp=0;
            if(a[i]>='A'&&a[i]<='F'){
                tmp=10+(a[i]-'A');
            }
            else{
                tmp=a[i]-'0';
            }
            res=res*16+tmp;
        }
        cout<<res<<endl;
    }
    return 0;
}

需要知道十進位制轉為十六進位制的原理:十六進位制數從低位到高位(即從右往左)計算,第0位的權值是16的0次方,第1位的權值是16的1次方,第2位的權值是16的2次方,依次遞增下去,把最後的結果相加的值就是十進位制的值了。

  十六進位制就是逢16進1,十六進位制的16個數為0123456789ABCDEF。

  例:將十六進位制的(2B)H轉換為十進位制的步驟如下:

\1. 第0位 B x 16^0 = 11;

\2. 第1位 2 x 16^1 = 32;

\3. 讀數,把結果值相加,11+32=43,即(2B)H=(43)D。

具體其他進位制相互轉換,請看大神部落格:

https://www.cnblogs.com/gaizai/p/4233780.html#_labelConvert13

相關文章