题目来源
题目描述
题目解析
本题考察位运算:
- 一个字节,等于8个二进制位
- 题目要求我们对于一个int(4字节,32位)每8位一组,将它们的二进制提取出来,然后相加
- 怎么提取呢?注意到与0xff相与既可以提出出最低的8位。所以我们可以每8位每8位移动一次,然后将所有的相加
#include <utility>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <functional>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <map>
#include <random>
#include <ctime>
#include <iterator>
using namespace std;
class Solution{
// 00000000 00000000 00000000 00000000
// 四个字节大小
int getValidType1(int num){
int p1 = num & (0xff);
int p2 = (num >> 8) & (0xff);
int p3 = (num >> 16) & (0xff);
int p4 = (num >> 24) & (0xff);
int sum = p1 + p2 + p3 + p4;
return sum;
}
int getValidType2(int num)
{
int sum = 0;
for (int i = 0; i < 4; i++) {
sum += num % 256;
num /= 256;
}
return sum;
}
int getValidType(int num, int b, int c){
int sum = getValidType1(num);
int mod = sum % b;
return mod < c ? mod : -1;
}
// 对数据进行分类
int maxLength(std::vector<int> &nums, int b, int c){
int ans = -1; // 一定能
std::map<int, int> map;
for(auto num : nums){
auto type = getValidType(num, b, c);
if(type != 0){
map[type]++;
ans = std::max(ans, map[type]);
}
}
return ans;
}
//---------------------------
struct Info{
int b;
int c;
std::vector<int> vec;
Info(int b = 0, int c = 0) : b(b), c(c), vec(10, 0){
}
};
// 对输入数据进行预处理
Info split(std::string &str, char ch){
int j = 0;
int idx = 0;
Info info;
for (int i = 0; i < str.size(); ++i) {
if(str[i] == ch){
auto tmp = stoi(str.substr(j, i - j));
j = i + 1;
if(idx == 0){
info.b = tmp;
}else if(idx == 1){
info.c = tmp;
}else{
info.vec[idx - 2] = tmp;
}
idx++;
}
}
return info;
}
public:
int process(std::string str){
auto info = split(str, ' ');
return maxLength(info.vec, info.b, info.c);
}
};
int main(){
std::string str;
getline(std::cin, str);
Solution a;
std::cout << a.process(str);
return 0;
}