Հազար բաժանարար Leetcode լուծում


Դժվարության մակարդակ Հեշտ
String

Խնդիրի հայտարարություն

Այս խնդրում մեզ տրվում է ոչ-բացասական ամբողջ թիվ: Մենք պետք է ամբողջ թիվը ամբողջությամբ վերափոխենք այնպիսի ձևաչափի, որում կլինեն որոշ կետեր, որոնք բաժանում են բոլոր հազարավորները, այսինքն `յուրաքանչյուր 3 տեղից հետո կետեր կան աջից:

Օրինակ

#1

n = 987
"987"

#2

n = 123456789
"123.456.789"

Բացատրությունը.

Համարը ՝ 123456789: Աջ ​​կետը աջից կլինի 3 տեղ: Այսպիսով, աջից տեսնելով, մենք կթողնենք 9,8-ը և 7-ը և մի կետ կդնենք 6-ի և 7-ի միջև: Հետո 6,5-ը և 4-ը թողնելուց հետո, մենք կետ կդնենք 3-ի և 4-ի միջև:
Հիմա թողնելով 3,2 և 1-ը, մենք կետ կտեղադրեինք միայն այն դեպքում, եթե ձախում ավելի շատ թիվ լիներ, որովհետև ըստ հարցի պետք է լինի երկու թվերի արանքում:
Այսպիսով, մենք ոչ մի կետ չենք դնի:

Մոտեցում

Առաջին հերթին, մենք թիվը փոխարկում ենք տողի (թող str): Դրանից հետո մենք աջից անցնում ենք լարային շարանը: Դրա համար մենք օգտագործում ենք for հանգույց: Յուրաքանչյուր օղակում մենք տեղադրում ենք դրա երեք նիշերը, որին հաջորդում է կետը:
Բայց յուրաքանչյուր թվանշանի ներդիրից հետո մենք ստուգելու ենք, թե արդյոք հասել ենք փողոցի ձախ եզրից: Եթե ​​այո, ապա մենք կկոտրենք օղակը: Հակառակ դեպքում, մենք կշարունակենք տեղադրել 3 թվանշանները, ապա 1 կետ:

Նկատի ունեցեք, որ կետը տեղադրելու 3-րդ ստուգումը կարևորագույնն է, որը կօգտագործվի 123-ի կամ 123.456-ի կամ 123.456.789-ի նման սցենարներում, որտեղ մեզ անհրաժեշտ չէ կետ տեղադրել ամենափոքր թվանշանից առաջ:
Քանի որ մենք նիշերն աջից ձախ ենք ներմուծում, ուստի մեր ստեղծած տողը պետք է հակադարձվի `վերջնական պատասխան ստանալու համար: Այսպիսով, հետ շրջելուց հետո լարային, վերադարձիր այն:

Հազար բաժանարար Leetcode լուծում

Իրականացման

C ++ ծրագիր հազար տարանջատող Leetcode լուծման համար

#include <bits/stdc++.h> 
using namespace std;
string thousandSeparator(int n) {
    string str=to_string(n);
    stringstream ss;
    for(int i=str.length()-1;i>=0;){
        ss<<str[i];//inserting 1st digit
        i--;
        if(i==-1)break;//checking if we are out of left bound
        ss<<str[i];//inserting 2nd digit
        i--;
        if(i==-1)break;//checking if we are out of left bound
        ss<<str[i];//inserting 3rd digit
        i--;
        if(i==-1)break;//checking if we are out of left bound
        ss<<".";//after 3 digits insertion, finally inserting a dot "."
    }
    str= ss.str();
    reverse(str.begin(),str.end());//reversing the final string
    return str;
}

int main()
{
    cout << thousandSeparator(123456789);
}
123.456.789

Java ծրագիրը հազար տարանջատող Leetcode լուծման համար

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

class Solution
{  
    public static  String thousandSeparator(int n) 
    {
        String str=n+"";
        StringBuilder sb=new StringBuilder();
        for(int i=str.length()-1;i>=0;){
            sb.append(str.charAt(i));//inserting 1st digit
            i--;
            if(i==-1)break;//checking if we are out of left bound
            sb.append(str.charAt(i));//inserting 2nd digit
            i--;
            if(i==-1)break;//checking if we are out of left bound
            sb.append(str.charAt(i));//inserting 3rd digit
            i--;
            if(i==-1)break;//checking if we are out of left bound
            sb.append(".");//after 3 digits insertion, finally inserting a dot "."
        }
        return sb.reverse().toString();//reverse and return the final string
    }
    
    public static void main(String args[])
    {
        System.out.println(thousandSeparator(123456789));
    }
}
123.456.789

Բազմության վերլուծություն հազար տարանջատող Leetcode լուծման համար

Timeամանակի բարդություն

O (len): մենք անցնում ենք տրված թիվը աջ թվանշանից ձախ և հետևաբար ժամանակի բարդությունը կլինի O (len), որտեղ len- ը տրված համարի թվանշանների քանակն է:

Տիեզերական բարդություն 

O (len): մենք օգտագործել ենք stringbuilder java- ում և stringstream c ++ - ում, այսպիսով օգտագործելով լրացուցիչ տարածք ՝ տարածության բարդությունը O (len) է դառնում: