您的位置:首页 > 编程语言

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

2017-10-30 08:13 260 查看
华为早些年的笔试编程题还是偏简单的,都是常规的问题,用心学了都会做.

题目链接:[这儿].

第一题:

题目:

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


第三题:

题目:
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。

解析:
深度优先搜索,由于是简单数独,因此就不需要使用
e939
跳舞链算法,对于行、列还有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: