华为早些年的笔试编程题还是偏简单的,都是常规的问题,用心学了都会做.
题目链接:[这儿].
第一题:
-
题目:
-
有一个数组 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;
}
第三题:
-
题目:
- 数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。 解析:
-
深度优先搜索,由于是简单数独,因此就不需要使用跳舞链算法,对于行、列还有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;
}