搜索字符串是否至少包含一次从 0 到 9 的所有数字的最有效方法
Most Efficient way to search if a string contain all numbers from 0 to 9 at least once?
bool IsWin(string A, string B)
{
vector<int> vec = {0,1,2,3,4,5,6,7,8,9};
for(long int i=0;i<A.length();i++){
vec[A[i]-'0'] = 11;
}
if(IsArray(vec)){ //IsArray(vec) It just checks whether all elements are 11.
return true;
}
for(long int i=0;i<B.length();i++){
vec[B[i]-'0'] = 11;
}
return IsArray(Array);
}
似乎显而易见的方式是这样的:
bool has_all_digits(std::string const &input) {
std::vector<char> present(10, 0);
for (auto c : input)
present[c - '0' ] = 1;
return std::find(present.begin(), present.end(), 0) == present.end();
}
在这种情况下,std::bitset可能是解决此问题的最有效方法。
bool check(string s){
std::bitset<10> digits;
int digitCounter = 0;
int index;
for (char c : s){
if (std::isdigit(c)){
index = c - '0';
if (!digits[index]){
digitCounter++;
digits[index] = true;
if (digitCounter == 10)
return true;
}
}
}
return false;
}
如果 A 或 B 包含数字旁边的任何内容,这将有超出 vec 的范围例外。在循环之间,vec 需要重新初始化。此外,最后一行应IsArray(vec)
。为什么不使用vector<bool> vec
?
在你关心效率之前,算法应该工作并且是异常安全的。
没有基准测试,任何关于性能的讨论都是毫无意义的。所以你需要测量,然后测量更多。
考虑到这一点,这里有一个针对具有密集数字的长字符串优化的版本,即很有可能将所有数字包含在一个小子字符串中。该函数将在找到所有数字后立即退出,并且不会继续执行字符串的其余部分:
auto has_all_digits(const std::string& str) -> bool
{
std::array<int, 10> digits = {};
int num_digits = 0;
for (char ch : str)
{
if (!is_digit(ch))
continue;
// here is a cool branchless trick
// to count unique digits
int x = 1;
std::swap(digits[ch - '0'], x); // put 1 to digits and get the old value in x
num_digits += 1 - x; // increment if the old value was 0
if (num_digits == 10)
return true;
}
return false;
}
同样,不要忘记测量并查看此算法是否确实适合您的用例。
相关文章:
- 实现基于数字值(正、负、零)的条件表达式的最佳方法
- 将一系列数字映射到 CPP 中的值的简单方法
- 找到所有与自己求和的数字X的快速方法,去掉一个数字得到N
- 有没有更简单的方法可以从用户那里获取三个数字并按升序打印它们?
- 有效创建数字签名的正确方法是什么?我可以使用DSA_sign_setup()吗?
- 有什么方法可以在 c++ 中组织"cycling"(循环)数字?
- 查看数字是否包含在未排序的双数字间隔内的最有效方法?
- isdigit() 和 isalnum() 给出错误,因为输入是一个常量字符并且无法转换。其他可能查看输入是否为数字的方法?
- 有没有一种更快的方法,从特定的数字池中获取随机数
- sort() 方法 c++ 中的比较器函数.为大量数字获得不同的解决方案
- 在向量中找到连续数字的更有效方法
- 获取数字小数部分的最佳方法
- 获取数字最左边两个位的值的最便宜的方法是什么?
- 将两位数字转换为低内存表示的最快方法
- C/C++ 方法中最快/最短计算二进制数字总和/又名二进制中的 1 数
- 总结数字字符串输入的最佳方法
- 搜索字符串是否至少包含一次从 0 到 9 的所有数字的最有效方法
- 在C++有没有更好的方法可以做到这一点?检查哪些数字满足条件 [A*B*C = A! + B! + C!]
- C++:有哪些常规方法可以使代码更有效地用于大数字
- 对这些 n^2 个数字进行排序的最快方法是什么