我想创建一个函数,只要输入中提供的两个数字由相同的数字组成(不替换),该函数将返回true。
例如,543和435应该返回true,10001和11000应该返回true,但是111222和122222应该返回false。
我已经读过一些有关位掩码的信息,但并没有真正理解,您能帮我吗?
答案 0 :(得分:3)
我认为处理此问题的最简单方法是使用存储桶。创建一个长度为10(每个数字一位)的std::vector
,然后在每次遇到相应数字时增加索引。通过比较向量来完成:
bool compare_digits(int x, int y) {
std::vector<int> x_vec(10), y_vec(10);
while(x != 0) { //!= instead of > so that we can handle negatives
x_vec.at(x%10)++; //increment whatever digit is in the 1's place
x /= 10; //chop off the 1's place digit
}
while(y != 0) { //repeat for y
y_vec.at(y%10)++;
y /= 10;
}
//check if they had the same digits
return (x_vec == y_vec);
}
答案 1 :(得分:1)
两个数字a由相同的数字组成,如果每个数字的计数(出现次数)相同。这是通用基数(模板参数)的一些代码
template<int base=10>
bool compare_digits(int x, int y)
{
// 0 exclude trivial cases
if(x > base*y || y > base*x)
return false;
// 1 count occurrences of digits in x
int count[base]={0};
for(; x; x/=base)
++ count[x%base];
// 2 subtract counts of digits in y, if result < 0: return false
for(; y; y/=base)
if(--count[y%base] < 0)
return false;
// 3 check that count[]==0
for(int i=0; i!=base; ++i)
if(count[i]) return false;
return true;
}