Хиляда разделител Leetcode решение


Ниво на трудност Лесно
Низ

Декларация за проблема

В този проблем ни се дава неотрицателно цяло число. Трябва да преобразуваме цялото число в такъв формат, в който ще има няколко точки, които разделят всички хиляди, т.е. има точки след всеки 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). След това обхождаме низа str отдясно. За това използваме цикъл for. Във всеки цикъл вмъкваме трите му цифри, последвани от точка.
Но след всяко вмъкване на цифри ще проверяваме дали сме достигнали от лявата граница на str. Ако да, тогава ще прекъснем цикъла. В противен случай ще продължим да вмъкваме 3-те цифри и след това 1 точка.

Имайте предвид, че третата проверка за вмъкване на точка е от решаващо значение, която ще се използва в сценарии като 3 или 123 или 123.456, където не е нужно да вмъкваме точка преди най-лявата цифра.
Тъй като вмъкваме символите отдясно наляво, по този начин създаденият ни низ трябва да бъде обърнат, за да получим окончателния отговор. По този начин, след обръщане на низ, Върни го.

Хиляда разделител 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

Сложност във времето

O (len): ние обхождаме даденото число от дясната цифра наляво, така че сложността на времето ще бъде O (len), където len е броят на цифрите в дадения номер.

Сложност на пространството 

O (len): използвали сме конструктор на низове в java и stringstream в c ++, като по този начин използването на допълнително пространство прави сложността на пространството O (len)