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

C++での文字列のエンコードとデコード


文字列のリストがあるとします。文字列のリストを文字列にエンコードできるアルゴリズムを設計する必要があります。また、文字列の元のリストにデコードして戻すデコーダーを1つ作成する必要があります。これらのマシンにエンコーダーとデコーダーがインストールされていて、次の2つの異なる機能があるとします-

マシン1(送信者)には機能があります

string encode(vector<string< strs) {
   //code to read strings and return encoded_string;
}

マシン2(レシーバー)には機能があります

vector<string< decode(string s) {
   //code to decode encoded_string and returns strs;
}

したがって、入力が{"hello"、 "world"、 "coding"、 "challenge"}のような場合、出力はエンコードされた文字列5#hello5#world6#coding9#challenge、デコードされた形式[hello、world、coding 、チャレンジ、]

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

  • 関数encode()を定義します。これには、配列strsが必要です。

  • ret:=空の文字列

  • 初期化i:=0の場合、i

    • ret:=ret concatenate size of strs [i]

  • retを返す

  • 関数getNext()を定義します。これには、x、start、s、

    が必要です。
  • idx:=sのサイズ

  • 初期化i:=開始の場合、i

    • s [i]がxと同じ場合、-

      • idx:=i

      • ループから出てきます

  • idxを返す

  • メソッドのデコードを定義します。これには時間がかかります

  • 配列retを定義する

  • i:=0

  • n:=sのサイズ

  • i

    • hashPos:=getNext('#'、i、s)

    • len:=(整数としてのインデックス(iからhashPos --i --1)までのsの部分文字列

    • i:=hashPos + 1

    • retの最後にインデックス(iからlen-1)のsの部分文字列を挿入します

    • i:=i + len

  • retを返す

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto< v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Codec {
public:
   string encode(vector<string>& strs) {
      string ret = "";
      for (int i = 0; i < strs.size(); i++) {
         ret += to_string(strs[i].size()) + "#" + strs[i];
      }
      return ret;
   }
   int getNext(char x, int start, string s){
      int idx = s.size();
      for (int i = start; i < s.size(); i++) {
         if (s[i] == x) {
            idx = i;
            break;
         }
      }
      return idx;
   }
   vector<string> decode(string s) {
      vector<string> ret;
      int i = 0;
      int n = s.size();
      while (i < n) {
         int hashPos = getNext('#', i, s);
         int len = stoi(s.substr(i, hashPos - i));
         i = hashPos + 1;
         ret.push_back(s.substr(i, len));
         i += len;
      }
      return ret;
   }
};
main(){
   Codec ob;
   vector<string> v = {"hello", "world", "coding", "challenge"};
   string enc = (ob.encode(v));
   cout << "Encoded String " << enc << endl;
   print_vector(ob.decode(enc));
}

入力

{"hello", "world", "coding", "challenge"}

出力

Encoded String 5#hello5#world6#coding9#challenge
[hello, world, coding, challenge, ]

  1. 2つの文字列を乗算し、結果をC++の文字列として返すようにプログラムします。

    文字列として2つの数値があるとします。それらを乗算し、結果を文字列で返す必要があります。したがって、数値が「28」と「25」の場合、結果は「700」になります これを解決するには、次の手順に従います- 2つの引数xとyを取ると、xがyを分割することを示します x <−Infinityおよびy =1の場合、無限大を返します a:=| x |、b:=| y |およびans:=0 =0 p:=0 =0 p:=p + 1 a:=a −(左シフトb、p回) ans:=ans+左シフト1p回 0も真の場合は、ansを返します。

  2. C++で2つのバイナリ文字列を追加するプログラム

    2進数の文字列が2つある場合、それら2つの2進数文字列を加算して得られた結果を見つけ、その結果を2進数文字列として返す必要があります。 2進数は、0または1のいずれかで表される数値です。2つの2進数を加算する際には、2進数の加算規則があります。 0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0, carry 1 入力 str1 = {“11”}, str2 = {“1”} 出力 “100” 入力 str1 = {“110”},