总结15个大厂机试面试问题及答案,连第一个问题都没过!

前言 

前两天有群友在说,去华为面试的时候遇到了机试部分,但是没有提前做准备,导致凉凉了,所以小编连忙准备了一些各大厂的机试题,以便不时之需。


一:字符串最后一个单词的长度:
题目:输入为数个单词,以空格隔开;要求输出最后一个单词的长度。
思路:读入字符串,求出字符串具体长度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,还有更多大厂面试专题资料和视频哦!

写文不易,觉得有帮助还请点赞关注支持一下小编,也欢迎各位大佬提出问题,感谢!!!

猜你喜欢

转载自blog.csdn.net/qq_43080036/article/details/109027060