Leetcode Həlli Sözləri Arasında Boşluqları Yenidən Düzəldin

Çətinlik səviyyəsi Asan
Tez-tez soruşulur google
alqoritmlər kodlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutions SimBaxılıb 27

Problem bəyanat

Bu problemdə bizə bir mətn verilir sim boşluqlar arasında yerləşdirilən bəzi sözlərə sahib olmaq. Sözlərdə yalnız kiçik ingilis hərfləri ola bilər. Əlbətdə hər söz ən azı bir boşluqla ayrılır. Mətndə ən azı bir söz var.
məsələn mətn = "təcrübə mükəmməl edir"
Gördüyümüz kimi ixtiyari boşluq sayı var.
Mətni elə bir formata çevirməliyik ki, hər bir söz arasında bərabər sayda boşluq olsun və hər hansı bir boşluq qalsın, onda son sözdən sonra yığılacaq.
Boşluqların ümumi sayını dəyişdirmək məcburiyyətində deyilik. Həm də sözlərin ardıcıllığı dəyişdirilməməlidir.

misal

text = " practice makes perfect"
"practice makes perfect "

Explanation:

Leetcode Həlli Sözləri Arasında Boşluqları Yenidən Düzəldin

7 boşluq və 3 sözdən ibarətdir.
Sözlər arasındakı 7-3 = 1 boşluğu uyğunlaşdırmaq üçün 2 boşluğu bərabər şəkildə böləcəyik. Beləliklə, çıxışımızda sözlər arasında 7/2 = 3 boşluq olacaq və son sözdən sonra 7-6 = 1 boşluq yığılacaq.
Bu səbəbdən nəticə “təcrübə mükəmməl edir” olacaqdır.

text = " this is a sentence "
"this is a sentence"

Explanation:

Cəmi 9 boşluq və 4 söz var. 9 boşluğu sözlər arasında bərabər şəkildə bölə bilərik: 9 / (4-1) = 3 boşluq.

Yanaşma

Burada iki tapşırıq etməliyik. Birincisi, giriş sözündən bütün sözləri əldə etməkdir sim. İkincisi, boşluqları saymalıyıq. Bu məqsədlə giriş sətirini xətti keçirik. Tapılan xarakter boşluqdursa, iki şey edirik, biri bu boşluğu saymaq, digəri isə mövcud sözü sonlandırmaq və sözlər siyahısına əlavə etməkdir.
Mövcud xarakter boşluq deyilsə, onu cari sözümüzə əlavə edirik. Nəhayət, son boşluqdan sonra hər hansı bir söz görünürsə, keçiddən sonra da bu sözü əlavə edirik.

Beləliklə, boşluq sayını və giriş sətirindəki sözləri alırıq. İndi boşluqları sözlər arasında bərabər bölməliyik. Ancaq giriş sətirində yalnız bir söz ola biləcəyinə dair bir vəziyyətə diqqət yetirməliyik, buna görə də bu sözün ardından bütün boşluqları olan bir simli qaytarmalıyıq. Əks təqdirdə, bu boşluqları sözlər siyahısı arasında bərabər şəkildə bölməliyik.

Tutaq ki, n söz varsa, sözlər arasındakı mövqelər n-1-dir.
Beləliklə, boşluqları (sayaq) bu n-1 yerlərə bölməliyik
bu səbəbdən mərtəbə (count / n-1) bütün sözləri ayıracaq boşluqların eni olacaqdır.
və qalan boşluq sayı son sözdən sonra əlavə olunacaq.
yəni% (n-1) sayı boşluqların qalan sayı olacaqdır.

Nəhayət, hər bir söz və hər bir söz cütü arasındakı boşluq sayını (say / n-1) əlavə etməyə davam edəcəyik və son sözdən sonra boşluqların% (n-1) sayıb son sətri qaytarırıq.

Həyata keçirilməsi

C ++ Proqramı Sözlər Leetcode Həlli Arasında Boşluqları Yenidən Düzəldin

#include <bits/stdc++.h>
using namespace std;

string reorderSpaces(string text) 
{
        int count=0;
        stringstream ss;
        vector<string> list;
        for(int i=0;i<text.length();i++){
            if(text[i]==' '){
                if(ss.str().size()>0)list.push_back(ss.str());//if there is some character present, only then 
                // insert into list
                count++;
                ss.str("");//empties the stringstream object
            }else{
                ss<<text[i];
            }
        }
        if(ss.str().size()>0)list.push_back(ss.str());//in case if any string is after the last space, that is not inserted into list.
        
        
        int wid=0,rem=0,l=0;
        if(list.size()==1){
            wid=0;
            rem=count;
        }else{
        /*number of positions between n words is n-1. thus l = list.size()-1*/
        l=list.size()-1;
        /*distributing the spaces equally in l places*/
        wid=count/l;
        /*and the remaining spaces will be appended at last*/
        rem=count%l;
        }
        ss.str("");
        for(int i=0;i<list.size();i++){
            ss<<list[i];//appending a word
            int w=wid;
            if(i<list.size()-1)
            while(w--!=0)ss<<' ';//appending spaces which is width we calculated above
        }
        while(rem--!=0)ss<<' ';//finally appending all the remaining spaces
        return ss.str();
}

int main()
{
    cout << reorderSpaces("  this   is  a sentence ");
}
this   is   a   sentence

Sözlər arasındakı boşluqların yenidən təşkil edilməsi üçün Java Proqramı Leetcode Həlli

import java.util.*;
import java.lang.*;

class Rextester
{  
    public static void main(String args[])
    {
        System.out.println(reorderSpaces("  this   is  a sentence "));
    }
    
    public static String reorderSpaces(String text) 
    {
        int count=0;
        StringBuilder sb=new StringBuilder();
        List<String> list=new ArrayList<String>();
        for(int i=0;i<text.length();i++){
            if(text.charAt(i)==' '){
                if(sb.length()>0)list.add(sb.toString());//if there is some non-space character also present, only then 
                // insert into list
                count++;//counting spaces
                sb=new StringBuilder();//empties the stringstream object
            }else{
                sb.append(text.charAt(i));
            }
        }
        if(sb.length()>0)list.add(sb.toString());//in case if any string is after the last space, that is not inserted into list.
        
        
        int wid=0,rem=0,l=0;
        if(list.size()==1){
            wid=0;
            rem=count;
        }else{
       /*number of positions between n words is n-1. thus l = list.size()-1*/
        l=list.size()-1;
      /*distributing the spaces equally in l places*/
        wid=count/l;
       /*and the remaining spaces will be appended at last*/
        rem=count%l;
        }
        sb=new StringBuilder();
        for(int i=0;i<list.size();i++){
            sb.append(list.get(i));//appending a word
            int w=wid;
            if(i<list.size()-1)
            while(w--!=0)sb.append(' ');//appending spaces which is width we calculated above
        }
        while(rem--!=0)sb.append(' ');//finally appending all the remaining spaces
        return sb.toString();
    }
}
this   is   a   sentence

Sözlər Leetcode Həlli Arasında Yenidən Düzəldilmiş Boşluqlar üçün Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

O (n): Birincisi, giriş xəttimizi xətti keçirik və boşluqdan ayrılmış sözləri siyahımızda saxlayırıq. Daha sonra çıxış xəttimizi xətti vaxtda yaradırıq. Beləliklə, zaman mürəkkəbliyi O (n) olacaqdır.

Kosmik Mürəkkəblik 

O (n): Sözlər siyahısı və sətir düzəldicisi (cpp halında sətir axını) şəklində xətti əlavə yerdən istifadə etdik.

Şərh yaz

Translate »
1