华为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)的解法也可以过这个题,毕竟数据量不是很大.
代码:
输入一个字符串,求出该字符串包含的字符集合, 按照原先给出顺序输出.
解析:
用
代码:
数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。
解析:
深度优先搜索,由于是简单数独,因此就不需要使用
e939
跳舞链算法,对于行、列还有9个小宫格维护一个数字
代码:
额外代码:
题目链接:[这儿].
第一题:
题目:有一个数组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; }
相关文章推荐
- 字符集合---- 华为2016研发工程师编程题
- 华为2016研发工程师编程题之字符集合
- 删数--约瑟夫环-- 华为2016研发工程师编程题
- 华为2016研发工程师编程题3数独
- 华为2016研发工程师编程题
- 华为2016研发工程师编程题1删数
- 华为2016研发工程师编程题2字符集合
- 字符集合-- 华为2016研发工程师编程题
- 华为2016研发工程师编程题(1)----删数
- 华为2016研发工程师编程题---删数
- 华为2016研发工程师编程题(2)----字符集和
- 华为2016研发工程师编程题
- 微信红包(腾讯2016研发工程师编程题)
- 华为研发工程师编程题----汽水瓶
- 递归生成格雷码----腾讯2016研发工程师编程题
- 网易2016研发工程师编程题
- 网易2016研发工程师编程题:奖学金
- 平均年龄(<cmath> 中 ceil 函数的应用)---- 美团2016研发工程师在线编程题
- 对角线打印二维数组----美团2016研发工程师编程题(二)
- 华为研发工程师编程题(2)----明明的随机数