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, ]
-
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を返します。
-
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”},