【huawei】华为研发工程师编程题

点击上方蓝字关注我,我们一起学编程
如果觉得内容还不错,请帮忙分享一下
有任何疑问或者想看的内容,欢迎私信

微信搜索《编程笔记本》(codingbook2020),获取更多干活。

今天我们来做几道华为研发工程师编程题


1、⭐⭐⭐有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是 5 瓶,方法如下:先用 9 个空瓶子换 3 瓶汽水,喝掉 3 瓶满的,喝完以后 4 个空瓶子,用 3 个再换一瓶,喝掉这瓶满的,这时候剩 2 个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用 3 个空瓶子换一瓶满的还给老板。如果小张手上有 n 个空汽水瓶,最多可以换多少瓶汽水喝?

解析:由于允许借汽水的操作,实际上我们只要两个空汽水瓶就能够喝到一瓶汽水。所以问题就很简单了,将所有空汽水瓶的数量除以 2 就是喝到的汽水数量。

C++ 代码:

#include <iostream>
 
using namespace std;
 
int main()
{
    int n = 0;
     
    while (cin >> n && n != 0) {
        cout << n / 2 << endl;
    }
     
    return 0;
}

2、⭐⭐⭐明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1到 1000 之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

解析:由于 N 的范围小于 1000 ,数字量不大,且有排序的需求,我们可以运用计数排序的思想,用空间换时间。

C++ 代码:

#include <iostream>

using namespace std;

int main() {
    int N, n;

    while (cin >> N) {
        vector<int> a(1001, 0);

        while (N--) {
            cin >> n;
            a[n] = 1;
        }

        for (int i = 1; i < 1001; ++i) {
            if (a[i] != 0) {
                cout << i << endl;
            }
        }
    }

    return 0;
}

3、⭐⭐⭐写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。(多组同时输入)

C++ 代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s;
    
    while (cin >> s) {
        int radix = 1;
        int res = 0;
    
        for (int i = s.size() - 1; i >= 0; --i) {
            if (s[i] >= '0' && s[i] <= '9') {
                res += (s[i] - '0') * radix;
            } else if (s[i] >= 'A' && s[i] <= 'F'){
                res += (s[i] - 'A' + 10) * radix;
            } else if (s[i] >= 'a' && s[i] <= 'f'){
                res += (s[i] - 'a' + 10) * radix;
            }
    
            radix *= 16;
        }
    
        cout << res << endl;
    }

    return 0;
}

4、⭐⭐⭐⭐有一个数组 a [N] 顺序存放 0〜N-1 ,要求每隔两个数删除掉一个数,到末尾时循环至开头继续进行,求最后一个被删除掉的数的原始下标位置。以 8 个数(N = 7)为例:{0,1,2,3,4,5,6,7},0-> 1-> 2(删除)-> 3-> 4-> 5(删除)-> 6-> 7-> 0(删除),如此循环直到最后一个数被删除。

解析:这是典型的约瑟夫环问题,我们可以用队列或链表模拟这样的情景,这里使用队列。

C++ 代码:

#include <iostream>
#include<queue>

using namespace std;

int main()
{
    int n;

    while (cin >> n) {
        queue<int> q;

        for(int i = 0; i < n; ++i) {
            q.push(i);
        }

        while(q.size() > 1) {
            q.push(q.front());
            q.pop();
            q.push(q.front());
            q.pop();
            q.pop();
            
        }

        cout << q.front() << endl;
    }

    return 0;
}

5、⭐⭐⭐⭐输入一个字符串,求出该字符串包含的字符集合。

C++ 代码:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    string s;

    while (cin >> s) {
        vector<int> book(256, 0);
        string res;

        for (int i = 0; i < s.size(); ++i) {      
            ++book[s[i]];
            if (book[s[i]] == 1) {    // 第一次出现
                res += s[i];
            }
        }
        
        cout << res << endl;
    }

    return 0;
}

6、⭐⭐⭐⭐数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。输入 9 行,每行为空格隔开的 9 个数字,为 0 的地方就是需要填充的。

解析:在接收输入数据时保存 0 的位置,处理每个 0 的位置。在处理某个 0 的位置时,判断当前行、当前列、当前九宫格内哪些数字被占用,依次放置未被占用的数字,递归处理。若当前 0 位置处理完成,则该位置不为 0 。

C++ 代码:

#include <iostream>
#include <vector>

using namespace std;

bool solve(vector<vector<int> >& matrix, const vector<pair<int, int>>& blank, int n){
    if(n >= blank.size()) {
        return true;
    }

    vector<bool> flags(9, false);
    int x = blank[n].first;     // 行
    int y = blank[n].second;    // 列

    for (int i = 0; i < 9; ++i) {
        // 行摒除
        if (matrix[x][i] != 0) {
            flags[matrix[x][i] - 1] = true;
        }

        // 列摒除
        if (matrix[i][y] != 0) {
            flags[matrix[i][y] - 1] = true;
        }
    }

    // 宫格摒除
    int a[9][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}, {0, 0}};
    int m = x / 3;
    int k = y / 3;
    m = m * 3 + 1;
    k = k * 3 + 1;

    for (int i = 0; i < 9; ++i) {
        int tmp = matrix[m + a[i][0]][k + a[i][1]];

        if (tmp != 0) {
            flags[tmp - 1] = true;
        }
    }
    
    // 尝试放置数字
    for (int i = 1; i <= 9; ++i) {
        if (!flags[i - 1]) {
            matrix[x][y] = i;

            if (!solve(matrix, blank, n + 1)) {
                matrix[x][y] = 0;
            } else {
                break;
            }
        }
    }
    
    // 放置成功
    if(matrix[x][y] != 0) {
        return true;
    } else {
        return false;
    }
}

int main() {
    vector<vector<int>> matrix(9, vector<int>(9));
    vector<pair<int, int>> blank;

    for (int i = 0; i < 9; ++i) {
        for (int j = 0; j < 9; ++j) {
            cin >> matrix[i][j];

            if (matrix[i][j] == 0) {
                blank.push_back(make_pair(i, j));
            }
        }
    }

    solve(matrix, blank, 0);

    for (int i = 0; i < 9; ++i) {
        for (int j = 0; j < 9; ++j) {
            cout << matrix[i][j];
            
            if (j != 8) {
                cout << " ";
            }
        }

        cout << endl;
    }

    return 0;
}

从这 6 道题目来看,题目难度都是很小的,关键是要思路清晰,代码书写规范。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值