点击上方蓝字关注我,我们一起学编程
如果觉得内容还不错,请帮忙分享一下
有任何疑问或者想看的内容,欢迎私信
微信搜索《编程笔记本》(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 道题目来看,题目难度都是很小的,关键是要思路清晰,代码书写规范。