笔试刷题day6

不要二

笔试刷题day6_第1张图片
链接:https://www.nowcoder.com/practice/1183548cd48446b38da501e58d5944eb?tpId=85&&tqId=29840&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

对于这道题目,我们要仔细理解,仔细读题。

任意两个蛋糕的距离不能等于2,即(x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) = 4;
看似不好下手,但其实我们可以把他拆解,因为横坐标之差和纵坐标之差只能为整数,所以可以拆解成
0 + 4 = 4
1 + 3 = 4
2 + 2 = 4
3 + 1 = 4
4 + 0 = 4
但又因为整数的平方不可能是2或3,所以原式只能拆解成0 + 4 = 4, 4 + 0 = 4.
,所以对于某一个蛋糕,其同一列上下两格不能有蛋糕,同一行上下两格不能有蛋糕。
可以先设置一个二维数组,都设置成1代表有蛋糕,遍历数组,如果该位置是1,把右2和下2位置设成0,因为是自左向右,自上向下遍历,所以不需要管左2和上2。

示例代码:

#include 
#include 

using namespace std;

int main(){

	int M, N;
	cin >> M >> N;

	vector<vector<int>> cakes;
	//赋值为1
	cakes.resize(M);
	for (auto& e : cakes)
		e.resize(N, 1);
	int count = 0;//记录蛋糕数量
	
	for (int i = 0; i < M; ++i){
	
		for (int j = 0; j < N; ++j){

			if (cakes[i][j] == 1){
			
				++count;
				//不能放蛋糕的位置
				if (j + 2 < N)
					cakes[i][j + 2] = 0;
				if (i + 2 < M)
					cakes[i + 2][j] = 0;
			}
		}
	
	}

	cout << count << endl;
	
	return 0;

}

atoi

笔试刷题day6_第2张图片
链接:https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId=13&&tqId=11202&rp=6&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

这道题目还是比较简单的,要注意几个点,一个是数字的正负,另一个是出现其他字符的处理。还有一个是空字符串

示例代码:

class Solution{
public:
	int StrToInt(string str){

		int res = 0;
		int flag = 1;//判断正负

		if (str[0] == '+'){
			
			flag = 1;
			str[0] = '0';
		}

		if (str[0] == '-'){
		
			flag = -1;
			str[0] = '0';
		}
		
		for (int i = 0; i < str.size(); ++i){
		
			if (str[i] < '0' || str[i] > '9'){
				res = 0;
				break;
			}
			
			res *= 10;
			res += (str[i] - '0');
		}

		return res * flag;
	}

};

你可能感兴趣的:(算法,c++,开发语言)