簡體   English   中英

檢查數字中單個數字的出現是否相同

[英]Check whether occurrence of individual digit in a number is same or not

我們需要檢查數字中單個數字的出現是否相同。例如,對於2244(2個出現2次,4個出現2次)。因此,兩個數字的出現相同。

//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一樣工作。 另外,您會建議一些優化代碼的好方法嗎?

嘗試這個:

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(例如:1122、2222、1234都合格,因為沒有數字的頻率高於任何數字)其他)。

該算法很簡單:

  1. 快速返回任何小於10的值; 一位數字立即合格。
  2. 建立模數殘差的計數器陣列。
  3. 查找數組中的第一個非零值
  4. 從那時起,找到與(4)中的值不匹配的第一個非零值。 如果到達序列末尾而沒有發現這種差異,則原始數字中的所有數字必須具有相同的計數。

總的來說,復雜度是對數以10為底的對數加上恆定大小的數組(10個元素)的單遍掃描。

范例程式碼

#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就是這樣的示例)。 我將其留給您作為基准測試以確定是否有任何性能優勢的練習。 老實說,我會懷疑。

在檢查所有重復計數是否相同時,如果計數不匹配,則可以直接返回false ,無需進一步檢查。 如果向量僅包含2222, 1111數字的單​​個計數2222, 1111則它將返回true

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; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM