首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查数字中单个数字的出现是否相同。

检查数字中单个数字的出现是否相同。
EN

Stack Overflow用户
提问于 2017-05-09 06:00:25
回答 3查看 1.6K关注 0票数 0

我们需要检查单个数字在一个数字中的出现是相同的还是not.For,例如对于2244 (2发生2次,4发生2次).Therefore,两个数字的发生是相同的。

代码语言:javascript
复制
//This will return true if occurrence of individual digit in
//a number is same else false

bool stable(int no)
{
    vector<int> v1;
    int k , count = 1;
    int arr[10];
    //Initializing all arr[] -> 0
    for(int k = 0 ; k < 10 ;k++)
    {
        arr[k] = 0;
    }
    while(no != 0)
    {
        k=no%10;
        arr[k]++;
        no=no/10;
    }
    for(int i = 0 ; i < 10 ; i++)
    {
        if(arr[i] != 0)
        {
            v1.push_back(arr[i]);  //storing count of individual digits
        }
    }
    vector<int>::iterator it , it2;
    for(it = v1.begin()+1 ,it2 = v1.begin(); it != v1.end() ; it++,it2++)
    {
        if(*it == *it2) //if all the values are same return true else false
        {
            count++;
        }
    }
    if(count == v1.size()) return true;
        return false; 
}

但是这个代码不适用于2222,1111,444。另外,您能提出一些优化代码的好方法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-09 08:35:32

我认为你让这件事变得更难了(或者我严重误解了这个问题,这种情况经常发生)。

假设条件是指定的:给定一个非零正值,如果所有数字以相同频率出现,包括1(例如: 1122、2222、1234 ),则一个数字是合格的,因为没有任何数字比任何其他数字的频率更高。

算法很简单:

  1. 任何小于10的值都可以快速返回;单个数字数字立即被限定。
  2. 构建一个模数残差的计数器数组。
  3. 在数组中找到第一个非零值。
  4. 从那时起,找到第一个与(4)中的值不匹配的非零值。如果在没有找到这样的差异的情况下到达序列的末尾,那么原始数字中的所有数字都必须有相同的计数。

在所有的复杂性是对数基数-10的输入数字加上一个单一通过扫描的恒定大小的阵列(10个元素)。

示例代码

代码语言:javascript
复制
#include <algorithm>
#include <iterator>

bool stable(unsigned value)
{
    if (value < 10) // single digit only, including zero
        return true;

    unsigned ar[10]={0};
    do { ++ar[value%10]; } 
    while (value /= 10);

    auto it = std::find_if(std::begin(ar), std::end(ar),
                            [](auto n) { return n != 0; });
    return std::find_if(std::next(it), std::end(ar),
                        [it](auto n){ return n && (n != *it);}) == std::end(ar);
}

如果最终为1(例如: 1234,102938是这样的例子),则可以通过保留最大数字计数,而不使用查找操作来进一步推进这一点。我将把它作为基准测试的练习,以确定是否有任何性能好处。我真的不相信会有。

票数 1
EN

Stack Overflow用户

发布于 2017-05-09 06:24:41

试试这个:

代码语言:javascript
复制
bool stable(int no)
{
    std::vector<int> v1;

    while (no != 0){
        v1.push_back(no%10);
        no /= 10;
    }

    std::sort(v1.begin(), v1.end()); //SORTING DIGITS IN ASCENDING ORDER

    std::vector<int> index = {0};  //BUILDING VEC WITH INDEXES WHERE CHANGES HAPPEN
    for (unsigned int i = 0; i < v1.size()-1; ++i){
        if (v1[i] != v1[i+1])
            index.push_back(i+1);
    }
    //EDGE CASE WHEN ONLY 1 DIGIT APPEARS (e.g. 555)
    if (index.size() == 1)
        return true;

    //CHECKING THAT ALL INDEXES ARE EQUALLY SEPARATED
    int diff = index[1] - index[0];
    for (unsigned int i = 1; i < index.size()-1; ++i){
        if (index[i+1] - index[i] != diff)
            return false;
    }
    return true;
}
票数 1
EN

Stack Overflow用户

发布于 2017-05-09 06:27:01

在检查所有重复计数是否相同时,如果计数不匹配,则可以直接返回false,无需进一步检查。如果向量只包含像2222, 1111这样的数字的一个计数,它将返回true

代码语言:javascript
复制
vector<int>::iterator it , it2;
for(it = v1.begin()+1 ,it2 = v1.begin(); it != v1.end() ; it++,it2++)
{
    if(*it != *it2) //if two values are not same return false
    {
        return false;
    }
}
return true; 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43862177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档