總結15個大廠機試面試問題及答案,連第一個問題都沒過!

2020-10-13 11:01:20

前言 

前兩天有群友在說,去華為面試的時候遇到了機試部分,但是沒有提前做準備,導致涼涼了,所以小編連忙準備了一些各大廠的機試題,以便不時之需。


一:字串最後一個單詞的長度:
題目:輸入為數個單詞,以空格隔開;要求輸出最後一個單詞的長度。
思路:讀入字串,求出字串具體長度l,然後指標從後往前直到指向空格,記錄此時的下標i,則最後一個字串的長度為l+1-i
程式碼如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#include<iostream>

#include<string>

using namespace std;

int main()

{

    string s;

    while(getline(cin,s))

    {

        int x=0;

        int len=s.size();

        for(int i=len-1;i>=0;i--)

        {

            if(s[i]==' ')

            {

                x=i+1;

                break;

            }

        }

        cout<<(len-x)<<endl;

    }

    return 0;

}

二:計算字元個數
題目:寫出一個程式,接受一個由字母和數位組成的字串,和一個字元,然後輸出輸入字串中含有該字元的個數。不區分大小寫。
思路:注意到不區分大小寫,查詢ASCII碼得知,大寫字母與小寫字母相差32(如A其值為65,而a其值為97,其他類推),所以便利陣列時,查詢條件除了s[i]==a還要加上「或(s[i]+32)==a或(s[i]-32)==a"
程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include<iostream>

#include<string>

using namespace std;

int main()

{

    string s;

    getline(cin,s);

    char a;

    cin>>a;

    int count=0;

    for(int i=0;i<s.length();i++)

    {

        if(s[i]==a||(s[i]+32)==a||(s[i]-32)==a)

        {

            count++;

        }

    }

    cout<<count<<endl;

    return 0;

}

三:明明的亂數
題目:實際上就是輸入多行資料,第一個為該行個數,剩下的是資料(注意是迴圈輸入)要求將輸入的資料排序去重(注意到數值在0到1000,而且都是整數。
思路:由於輸入的都是整數且有範圍限制,所以最多的輸出就是從0到1000全輸出,所以申請一個a[1001]已經足夠,譬如輸入7則a[7]==1,然後輸出時便利標記陣列,為一的輸出陣列下標即可。
程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

#include<iostream>

using namespace std;

int main()

{

    int N;

    int n;

    while(cin>>N)

    {

        int a[1001]={0};//初始化

        while(N--)

        {

            cin>>n;

            a[n]=1;

        }

 

 

    for(int i=0;i<1001;i++)

    {

        if(a[i]==1)

        {

            cout<<i<<endl;

        }

    }

    }

    return 0;

}

四:字串分割
題目:連續輸入字串,請按長度為8拆分每個字串後輸出到新的字串陣列;
•長度不是8整數倍的字串請在後面補數位0,空字串不處理。只輸入兩次。
思路:由於固定給出2次,運用函數思想,寫出字串分割函數呼叫兩次即可,注意到函數用到了遞迴的思想。
程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#include<iostream>

#include<string>

using namespace std;

void fun(string s)

{

    if(s=="")

    {

        return;

    }

    if(s.size()<=8)

    {

        s.append(8-s.size(),'0');

        cout<<s<<endl;

        return;

    }

        cout<<s.substr(0,8)<<endl;

        fun(s.substr(8,s.size()));//遞迴

 

}

int main()

{

    string a,b;

    getline(cin,a);

    getline(cin,b);

    fun(a);

    fun(b);

    return 0;

 

 

}

五:進位制轉換
題目:寫出一個程式,接受一個十六進位制的數,輸出該數值的十進位制表示。(多組同時輸入 )
思路:直接呼叫系統函數即可
程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

#include<iostream>

using namespace std;

int main()

{

    int a;

    while(cin>>hex>>a)

    {

        cout<<a<<endl;

    }

    return 0;

}

六:質數因子
題目:要求輸入long 型整數,從小到大輸出其址因子
思路:從2開始,反覆取餘,如果為0,代表2是其因子,但注意到除2以後仍可能被2整除,故2不變;若不為0,需要將2加一變為3,進入下個迴圈。
程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#include<iostream>

using namespace std;

int main()

{

    long a;

    int flag=2;

    while(cin>>a)

    {

      while(a>1)

      {

          if(a%flag==0)

          {

              a=a/flag;

              cout<<flag<<" ";

          }

          else

          {

              flag++;

          }

      }

    }

    cout<<endl;

    return 0;

}

七:取近似值
題目:寫出一個程式,接受一個正浮點數值,輸出該數值的近似整數值。如果小數點後數值大於等於5,向上取整;小於5,則向下取整。
思路:加上0.5後取整即可
程式碼如下

1

2

3

4

5

6

7

8

9

#include<iostream>

using namespace std;

int main()

{

    double a;

    cin>>a;

    cout<<int(a+0.5)<<endl;

    return 0;

}

八:合併表記錄
題目:資料表記錄包含表索引和數值(int範圍的整數),請對錶索引相同的記錄進行合併,即將相同索引的數值進行求和運算,輸出按照key值升序進行輸出
思路:由於測試用例不超過1000,故可以延續」明明的亂數「的思路,申請一個長度為1000的陣列,但注意到一旦輸入key值相同則將value 累加到a[key],隨後遍歷輸出即可
程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#include<iostream>

using namespace std;

int main()

{

    int num;

    int a[1000]={0};

    int key;

    int value;

    cin>>num;

   for(int i=0;i<num;i++)

   {

       while(cin>>key>>value)

       a[key]+=value;

   }

    for(int i=0;i<1000;i++)

    {

    if(a[i]!=0)

    {

        cout<<i<<" "<<a[i]<<endl;

    }

    }

    return 0;

}

九:提取不重複的整數
題目:輸入一個int型整數,按照從右向左的閱讀順序,返回一個不含重複數位的新的整數。
思路:整數只有10個,開闢一個長度為10 的標記陣列,初始化為0,每次進行判斷,第一次肯定不重複為零,然後將標記加一,隨後每次判斷,若標記不為零,代表以經重複,不累加計算。
程式碼如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#include<iostream>

using namespace std;

int main()

{

    int a;

    int b[10]={0};//標記陣列

    int num=0;//最終結果

    cin>>a;

    while(a)

    {

        if(b[a%10]==0)

        {

            b[a%10]++;

            num=10*num+(a%10);//只有標記為零是才計算

            a=a/10;

        }

        else

        {

            a=a/10;

        }

    }

    cout<<num<<endl;

    return 0;

}

十:字元個數統計
題目:編寫一個函數,計算字串中含有的不同字元的個數。字元在ACSII碼範圍內(0~127),換行表示結束符,不算在字元裡。不在範圍內的不作統計。
思路:仍然延續前面的思路,開闢一個長度為128 的標記陣列,隨後累加標記值不為一的個數即可。
程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#include<iostream>

using namespace std;

int main()

{

    int flag[128]={0};

    int sum=0;

    char a;

    while(cin>>a)

    {

        flag[a]=1;

 

    }

    for(int i=0;i<128;i++)

    {

        if(flag[i]==1)

        {

        sum++;

        }

    }

    cout<<sum<<endl;

    return 0;

 

}

十一:數位顛倒
題目:輸入一個整數,將這個整數以字串的形式逆序輸出

程式不考慮負數的情況,若數位含有0,則逆序形式也含有0,如輸入為100,則輸出為001
思路:呼叫系統函數,注意要參照algorithm庫
程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

#include<iostream>

//#include<string>

#include<algorithm>

using namespace std;

int main()

{

    string s;

    cin>>s;

    reverse(s.begin(),s.end());

    cout<<s<<endl;

    return 0;

}

十二:字串反轉
題目:寫出一個程式,接受一個字串,然後輸出該字串反轉後的字串。(字串長度不超過1000)
思路:呼叫系統函數即可
程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

#include<iostream>

#include<algorithm>

using namespace std;

int main()

{

    string s;

    cin>>s;

    reverse(s.begin(),s.end());

    cout<<s<<endl;

    return 0;

}

十三:句子逆序
題目:將一個英文語句以單詞為單位逆序排放。例如「I am a boy」,逆序排放後為「boy a am I」
所有單詞之間用一個空格隔開,語句中除了英文字母外,不再包含其他字元
思路:類同11,12,不過是型別換位了string型別,我們呼叫容器即可。注意到用空格隔開,而最後一個字元后沒有空格。
程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include<iostream>

#include<vector>

using namespace std;

int main()

{

    string s;

    vector<string> ss;

    while(cin>>s)

    {

        ss.push_back(s);

    }

    for(int i=ss.size()-1;i>0;i--)

    {

        cout<<ss[i]<<" ";

    }

    cout<<ss[0]<<endl;

    return 0;

}

十四:字串的連結最長路徑查詢
題目:給定n個字串,請對n個字串按照字典序排列。輸入第一行為一個整數記錄數位個數,第二行為資料。
思路:仍然是呼叫系統函數進行排序,主要是正確使用容器即可。先將輸入的字串裝入容器,利用系統函數排序,我們可以將程式碼中的vector<string>::iterator p中的p 視為指標指向每一個字串,隨後順序輸出即可
程式碼如下:</string>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#include<iostream>

#include<vector>

#include<algorithm>

using namespace std;

int main()

{

    int num;

    cin>>num;

    vector<string> ss;

    for(int i=0;i<num;i++)

    {

        string s;

        cin>>s;

        ss.push_back(s);

    }

    sort(ss.begin(),ss.end());

    vector<string>::iterator p;

    for(p=ss.begin();p!=ss.end();p++)

    {

        cout<<*p<<endl;

    }

    return 0;

}

十五:求int型整數在記憶體中儲存時1的個數
題目:輸入一個int型的正整數,計算出該int型資料在記憶體中儲存時1的個數。
思路:記憶體中的數都是0101即二進位制,我們將其轉換成二進位制即可,」除2取餘,倒序排序,高位補零「但我們不用這麼麻煩,每次取餘不為零時可知二進位制中必有1,此時計數即可。
程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include<iostream>

using namespace std;

int main()

{

    int a;

    int count=0;

    cin>>a;

    while(a)

    {

        if(a%2)

        {

            count++;

        }

        a/=2;

    }

    cout<<count<<endl;

    return 0;

}

 總結

做了那麼多題,每一個題都有不同的解決方案,更重要的還是思路,多想多做,加油!

 小編還整理了更多JAVA面試題:戳這裡免費領取,暗號:CSDN,還有更多大廠面試專題資料和視訊哦!

寫文不易,覺得有幫助還請點贊關注支援一下小編,也歡迎各位大佬提出問題,感謝!!!