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

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 ,
]

  1. 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の場合、

  2. C++で線が円に接触または交差するかどうかを確認します

    円と別の直線があるとします。私たちの仕事は、線が円に接しているか交差しているかを見つけることです。そうでない場合は、線が外側を通過します。したがって、以下のような3つの異なるケースがあります- ここでは、次の手順で解決します。これらは以下のようなものです- 中心と与えられた線の間の垂線Pを見つけます Pを半径r−と比較します rの場合、外部 P =rの場合、タッチします それ以外の場合は内部 垂直距離を取得するには、次の式を使用する必要があります(中心点は(h、k)) $$ \ frac {ah + bk + c} {\ sqrt {a ^ 2 + b ^ 2}} $$