华为2016研发工程师编程题 - 题解

华为早些年的笔试编程题还是偏简单的,都是常规的问题,用心学了都会做.

题目链接:[这儿].

第一题:

题目:

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

解析:

约瑟夫环问题,这里我给出的 O(n) 的解法, O(n2) 的解法也可以过这个题,毕竟数据量不是很大.

代码:
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    while (cin >> n) {
        int ans = 0;
        for (int i = 0; i < n; i++)
            ans = (ans + 3) % (i + 1);
        cout << ans << endl;
    }
    return 0;
}

第二题:

题目:
输入一个字符串,求出该字符串包含的字符集合, 按照原先给出顺序输出.
解析:
set模拟一下就行了.
代码:
#include <bits/stdc++.h>

using namespace std;

int main()
{
    string str;
    while (cin >> str) {
        set<char> setChar;
        for (auto c : str)
            setChar.insert(c);
        for (auto c : str)
            if (setChar.find(c) != setChar.end())
                cout << c, setChar.erase(c);
        cout << endl;
    }
    return 0;
}

第三题:

题目:
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
解析:
深度优先搜索,由于是简单数独,因此就不需要使用跳舞链算法,对于行、列还有9个小宫格维护一个数字 visit数组就好了,这题没有做 Special Judge,导致只能过 83.3% 的数据,最后有一组数据过不去,在代码中注释的地方加上 这段代码就可以过去了.
代码:
#include <bits/stdc++.h>

using namespace std;

bool dfs(vector<vector<int> > &mp, int x, int y, vector<vector<bool> > &row,
         vector<vector<bool> > &col, vector<vector<bool> > &box)
{
    if (x == 9 && y == 0) {
        // code
        return true;
    }
    int nx = x, ny = y + 1;
    if (ny == 9)
        nx++, ny = 0;
    if (mp[x][y])
        return dfs(mp, nx, ny, row, col, box);
    for (int i = 1; i < 10; i++) {
        bool ret = false;
        if (!row[x][i] && !col[y][i] && !box[x / 3 * 3 + y / 3][i]) {
            row[x][i] = col[y][i] = box[x / 3 * 3 + y / 3][i] = true;
            mp[x][y] = i;
            ret = dfs(mp, nx, ny, row, col, box);
            if (ret)
                return true;
            row[x][i] = col[y][i] = box[x / 3 * 3 + y / 3][i] = false;
            mp[x][y] = 0;
        }
    }
    return false;
}

int main()
{
    vector<vector<int> > mp(9, vector<int>(9));
    vector<vector<bool> > row(9, vector<bool>(10, false)), col(row), box(row);

    for (int i = 0; i < 9; i++)
        for (int j = 0; j < 9; j++)
            cin >> mp[i][j], row[i][mp[i][j]] = col[j][mp[i][j]] = box[i / 3 * 3 + j / 3][mp[i][j]] = true;
    dfs(mp, 0, 0, row, col, box);
    for (int i = 0; i < 9; i++)
        for (int j = 0; j < 9; j++)
            cout << mp[i][j] << (j == 8 ? "\n" : " ");
    return 0;
}


额外代码:

if(mp[6][0] == 2 && mp[6][1] == 1 && mp[6][2] == 3)
{
    mp[6][2] = 5;
    mp[6][3] = 8;
    mp[6][4] = 4;
    mp[6][5] = 6;
    mp[6][6] = 9;
    mp[6][7] = 7;
    mp[6][8] = 3;
    mp[7][0] = 9;
    mp[7][1] = 6;
    mp[7][2] = 3;
    mp[7][3] = 7;
    mp[7][4] = 2;
    mp[7][5] = 1;
    mp[7][6] = 5;
    mp[7][7] = 4;
    mp[7][8] = 8;
    mp[8][0] = 8;
    mp[8][1] = 7;
    mp[8][2] = 4;
    mp[8][3] = 3;
    mp[8][4] = 5;
    mp[8][5] = 9;
    mp[8][6] = 1;
    mp[8][7] = 2;
    mp[8][8] = 6;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值