1094 谷歌的招聘 (20 point(s)) (测试点一、二、四、五)

  • 最开始的时候不记得截断字符串的参数是怎么传递的,所以用了手动拼接的方式来截断。

    for(int j = 0; j < K; j++) tmp += str[i+j];

    写完后看了下,原来 substr() 有两个参数,第一个参数是 pos 起始位置,第二个参数 len 是长度。所以可以写成。

    tmp = str.substr(i, K);

  • 测试点一。

    0 和 1 可能当成数字判断是否是素数,但是之前不记得判读素数会包括 2 之前的数了,或者说只记得要从 2 开始,而忽略 0 1 的判断。

    实际上,算法笔记里面的判断素数函数也对 2 之前特殊判断,这算之前思路上的的漏洞。

    image

  • 测试点二、五。

    理解下为什么要把 < 改成 <= 。因为实际元素个数与下标差值为 1 。比如我们有 3 个元素,最后一个元素的下标是 2 。

    我们现在遍历连续数字,假设最低位数 K 是 1 ,当我们遍历可以发现,如果还是 < 没有等号,最后下标会遍历到 3 - 1 = 2 加上 < 实际下标是 1 < 2 。这会遗漏最后一个元素。

  • 测试点四。

    改正上面的 <= 后还差最后一个测试点,而这个测试点将 size() 换成 L 可以解决。

    造成这个问题的原因是, size() 的返回值是 unsigned int 。如果 K > size(), size() - K 运算后仍然会是正值而继续循环,但我们知道这时候连续数字位不足,应该退出循环了。

    所以换成 L - K 才能保证结果为负值正常退出。

    测试点一

    测试点二、四、五

// 25 points
#include <bits/stdc++.h>
using namespace std;

bool isPrime(int p){
	if(p <= 1) return false;
	for(int i = 2; i <= sqrt(p); i++)
		if(p % i == 0)
			return false;
	return true;
}

int main() {
	string str; 
	int L, K;
	cin >> L >> K >> str; 
	
	for(int i = 0; i <= L - K; i++){
		string tmp = "";
		tmp = str.substr(i, K);
		
		if(isPrime(stoi(tmp))){
			cout << tmp;
			return 0;
		}
	}
	cout << 404;
}
// 15 points
#include <bits/stdc++.h>
using namespace std;

bool isPrime(int p){
	for(int i = 2; i <= sqrt(p); i++)
		if(p % i == 0)
			return false;
	return true;
}

int main() {
	string str; 
	int L, K;
	cin >> L >> K >> str; 
	
	for(int i = 0; i < L - K; i++){
		string tmp = "";
		for(int j = 0; j < K; j++)	tmp += str[i+j];
		
		if(isPrime(stoi(tmp))){
			cout << tmp;
			return 0;
		}
	}
	cout << 404;
}

posted on 2021-09-22 21:17  Atl212  阅读(597)  评论(0)    收藏  举报

导航