C++でのテキストの位置揃え
単語の配列と幅maxWidthがあるとすると、各行の文字数が正確にmaxWidthになり、完全に両端揃えになるようにテキストをフォーマットする必要があります。貪欲なアプローチで言葉を詰め込む必要があります。つまり、各行にできるだけ多くの単語を詰め込みます。各行が正確にmaxWidth文字になるように、必要に応じて余分なスペース''を埋め込みます。
ここでは、単語間の余分なスペースをできるだけ均等に配置する必要があります。 1行のスペースの数が単語間で均等に分割されていない場合、左側の空のスロットには、右側のスロットよりも多くのスペースが割り当てられます。テキストの最後の行は、左揃えにし、単語の間に余分なスペースを挿入しないでください。
したがって、入力が次のような場合
これを解決するには、次の手順に従います-
-
結果と呼ばれる1つの配列を作成します
-
0からaのサイズの範囲のiの場合、iをjで更新します
-
幅:=0
-
範囲iからaのサイズおよび幅+aのサイズ[j]+j – i <=b、
のjの場合-
width:=width + a [j]
のサイズ
-
-
スペース:=1、追加:=0
-
j – 1!=1かつj!=aのサイズの場合、
-
スペース:=(b-幅)/ j – i – 1
-
extra:=(b-幅)mod(j – i – 1)
-
-
行:=a [i]
-
i+1からjの範囲のkの場合
-
空白スペースのスペース番号を行で連結します
-
余分な値が0より大きい場合は、スペースを線で連結します
-
余分に1つ減らす
-
line:=a[k]をlineと連結します
-
-
x:=行のサイズ
-
line:=concatenate(b --x)number of space with line
-
結果に行を挿入
-
-
解像度を返す
例
理解を深めるために、次の実装を見てみましょう-
#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; } void print_vector(vector<vector<auto>> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << "["; for(int j = 0; j <v[i].size(); j++){ cout << v[i][j] << ", "; } cout << "],"; } cout << "]"<<endl; } class Solution { public: vector<string> fullJustify(vector<string> &a, int b) { vector <string> result; int i, j; for(i = 0; i < a.size(); i = j){ int width = 0; for(j = i; j < a.size() && width + a[j].size() + j - i <= b; j++){ width += a[j].size(); } int space = 1; int extra = 0; if(j - i != 1 && j != a.size()){ space = (b - width) / (j - i - 1); extra = (b - width) % (j - i - 1); } string line(a[i]); for(int k = i + 1; k < j; k++){ line += string(space, ' '); if(extra-- > 0){ line += " "; } line += a[k]; } int x = line.size(); line += string(b - x, ' '); result.push_back(line); } return result; } }; main(){ vector<string> v = {"I", "love", "coding.", "here", "we", "will", "write", "some", "program"}; Solution ob; print_vector(ob.fullJustify(v, 16)); }
入力
["I", "love", "coding.", "here", "we", "will", "write", "some", "program"] 16
出力
[I love coding., here we will, write some, program , ]
-
C++でのライン上の最大ポイント
2D平面があるとします。同じ直線上にある点の最大数を見つける必要があります。したがって、ポイントが次のような場合- それから4つのポイントがあります これを解決するには、次の手順に従います- n:=ポイントの数、n <3の場合、nを返します ans:=2 1からn–1の範囲のiの場合 カウント:=0 インデックスiとi– 1から2つのポイントを取ります。これらは、p1、p2です。 p1ポイントとp2ポイントが同じ場合、 0からn–1の範囲のjの場合 points [j] .x=p1.xおよびpoints[j].y =p1.yの場合、
-
C++で線が円に接触または交差するかどうかを確認します
円と別の直線があるとします。私たちの仕事は、線が円に接しているか交差しているかを見つけることです。そうでない場合は、線が外側を通過します。したがって、以下のような3つの異なるケースがあります- ここでは、次の手順で解決します。これらは以下のようなものです- 中心と与えられた線の間の垂線Pを見つけます Pを半径r−と比較します rの場合、外部 P =rの場合、タッチします それ以外の場合は内部 垂直距離を取得するには、次の式を使用する必要があります(中心点は(h、k)) $$ \ frac {ah + bk + c} {\ sqrt {a ^ 2 + b ^ 2}} $$