2019 快手校招编程题两道解答

[编程题] 二进制中有多少个1

时间限制:1秒

空间限制:32768K

把一个32-bit整型转成二进制,其中包含多少个1,比如5的二进制表达是101,其中包含2个1

输入描述:

输入为整型(十进制),只需兼容32-bit即可,如5、32

输出描述:

输出为字符串,如“2”、“1”

输入例子1:

5

输出例子1:

2

例子说明1:

5的二进制是101,其中包含2个1

这是一道位运算的题目,注意之前的符号位

#include <iostream>
using namespace std;

int main()
{
	int n, res = 0;
	cin >> n;
	if (n < 0) {
		n = -n;
		res++;
	}
	while (n > 0) {
		if (n & 1)
			res++;
		n = n >> 1;
	}
	cout << res << endl;
}

[编程题] 机器人移动范围

时间限制:1秒

空间限制:32768K

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

输入描述:

一行三个正整数由空格分开,分别代表行数m,列数n,和坐标数位之和的阈值k,0 < m <= 100, 0 < n <= 100, 0 < k <= 20。

输出描述:

一个正整数,代表该机器人能够到达的格子数量。

输入例子1:

3 3 6

输出例子1:

9

这是一道简单的DFS题目

#include <iostream>
using namespace std;
const int N = 150;
const int dx[] = { 0,1, -1, 0 };
const int dy[] = { 1,0, 0, -1 };
bool visited[N][N];
int n, m, k;

int getNum(int n) 
{
	int res = 0;
	while (n > 0) {
		res += n % 10;
		n = n / 10;
	}
	return res;
}

void dfs(int x, int y)
{
	//cout << x << " " << y << endl;
	visited[x][y] = true;
	for (int i = 0; i < 4; i++) {
		int x_ = x + dx[i];
		int y_ = y + dy[i];
		if (x_ >= 0 && x_ < n && y_ >= 0 && y_ < m
			&& visited[x_][y_] == false
			&& getNum(x_) + getNum(y_) <= k) {
			dfs(x_, y_);
		}
			
	}
}

int main()
{
	
	cin >> n >> m >> k;
	dfs(0, 0);
	int res = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (visited[i][j])
				res++;
		}
	}
	cout << res << endl;
	
}

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/89678269