C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で同じ連続した違いがある番号


連続する2桁ごとの絶対差がKになるように、長さNのすべての非負の整数を見つける必要があるとします。回答のすべての数値は、数値0自体を除いて先行ゼロを持ってはならないことに注意する必要があります。回答は任意の順序で返送する場合があります。したがって、N=3およびK=7の場合、出力は[181,292,707,818,929]になります。ここでは、先行ゼロが1つあるため、070は有効な数値ではないことがわかります。

これを解決するには、次の手順に従います-

  • dpと呼ばれる1つの行列を作成し、そのサイズはn + 1になり、1から9をdp [1]

    に入力します。
  • 1からN–1の範囲のiの場合

    • 訪問済みと呼ばれるセットを定義する

    • 0からdp[i]

      のサイズの範囲のjの場合
      • x:=dp [i、j]

      • lastNum:=xの最後の桁

      • 数字:=lastNum + k

      • 数字が0から9の範囲にあり、(x * 10 +数字)が訪問されていない場合、

        • (10 * x +桁)をdp [i + 1]

          に挿入します
        • 訪問した配列に10*x+桁を挿入

      • 数字:=lastNum – K

      • 数字が0から9の範囲にあり、(x * 10 +数字)が訪問されていない場合、

        • (10 * x +桁)をdp [i + 1]

          に挿入します
        • 訪問した配列に10*x+桁を挿入

  • Nが1の場合、dp [N]

    に0を挿入します。
  • dp [N]

    を返します

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<int> numsSameConsecDiff(int N, int K) {
      vector <int> dp[N + 1];
      for(int i = 1; i <= 9; i++){
         dp[1].push_back(i);
      }
      for(int i = 1; i < N; i++){
         set <int> visited;
         for(int j = 0; j < dp[i].size(); j++){
            int x = dp[i][j];
            int lastNum = x % 10;
            int digit = lastNum + K;
            if(digit >= 0 && digit <= 9 && !visited.count(x * 10 + digit)){
               dp[i + 1].push_back(x * 10 + digit);
               visited.insert(x * 10 + digit);
            }
            digit = lastNum - K;
            if(digit >= 0 && digit <= 9 && !visited.count(x * 10 + digit)){
               dp[i + 1].push_back(x * 10 + digit);
               visited.insert(x * 10 + digit);
            }
         }
      }
      if(N == 1){
         dp[N].push_back(0);
      }
      return dp[N];
   }
};
main(){
   Solution ob;
   print_vector(ob.numsSameConsecDiff(3,7));
}

入力

3
7

出力

[181,292,707,818,929]

  1. C++の両側に同じ数の偶数または奇数の配列インデックス

    ここでは、1つの配列が与えられたと仮定して、1つの問題が発生します。 n個の要素があります。左側の偶数の頻度と右側の偶数の頻度が同じであるか、左側の奇数の頻度が右側の奇数の頻度と同じである1つのインデックスを見つける必要があります。そのような結果がない場合は、-1を返します。 配列が{4、3、2、1、2、4}のようであると仮定します。出力は2です。インデックス2の要素は2で、左側に奇数が1つだけあり、右側に奇数が1つだけあります。 この問題を解決するために、左右の情報を格納するためのペアの2つのベクトルを作成します。左側のベクトルは左側の奇数と偶数の頻度を格納し、右側のベクトルは右側でも同

  2. Pythonで同じ連続した違いを持つ数字を見つけるプログラム

    連続する2桁ごとの絶対差がKになるようなサイズNの配列を見つける必要があるとします。回答のすべての数値には、数値0自体を除いて先行ゼロがあってはなりません。 したがって、入力がN =4 K =7の場合、出力は[1818、2929、7070、8181、9292]になります。ここでは、0707は先行ゼロであるため無効です。 これを解決するには、次の手順に従います- Nが1と同じ場合、 0から9の範囲の新しいリストを返します queue:=1から9までのすべての要素でキューを作成します 0からN-2の範囲のnの場合、実行 len_queue:=キューのサイズ