vivo2022届提前批校招笔试题
幸运员工
题目描述:
选出工号中含有数字7或是7的倍数的幸运员工。
输入描述:
一组空格分隔的员工工号列表
输出描述:
幸运员工总人数,未找到时输出0
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
using namespace std;
class Solution {
public:
int findSeven(vector<int>& nums) {
int count = 0; //没有找到就返回0
for (int x : nums) {
if (x % 7 == 0) {
//7的倍数
count++;
}
else {
//含有数字7
while (x) {
int m = x % 10;
if (m == 7) {
//x中一旦找到7就退出循环
count++;
break;
}
x /= 10;
}
}
}
return count;
}
};
int main() {
string s; //保存从控制台输入的字符串
vector<int> numbers; //拆分后的数字
getline(cin, s);
while (!s.empty()) {
int loc = s.find(" "); //寻找空格在字符串s中的位置
if (loc == string::npos) { //没有找到空格,说明到了最后一个位置
numbers.push_back(stoi(s));
s.clear();
break; //清除字符串s并退出循环
}
string s_tmp = s.substr(0, loc); //从0开始往后数loc个字符
numbers.push_back(stoi(s_tmp));
s.erase(0, loc + 1); //擦除从0开始往后数loc+1个字符,包括擦除空格
}
Solution sol;
int res = sol.findSeven(numbers);
cout << res << endl;
}
string
中find
函数的返回值是查找字母在字符串中的位置。没有找到,则会返回npos
。
工号数字分为三种情况:
- 仅为7的倍数,如:105140
- 仅为含有7的数,如:105720、770251
- 既是7的倍数又是含有7的数,如:700000
第一种情况没有什么疑问,count
只自增一个就进入下一个循环。
第二种情况要注意,一个号码里有多个7的情况,不要对count
进行多次自增操作,具体做法就是一旦检测到7就及时进入下一个循环。
第三种情况,既是7的倍数又含有7,同样注意不要多次自增,具体解决方法就是将两种情况用if-else
语句分割,确定这个数符合一种情况就及时进入下一个循环,避免重复计数。