வரம்பில் மீண்டும் மீண்டும் இலக்கங்கள் இல்லாத மொத்த எண்கள்


சிரமம் நிலை நடுத்தர
அடிக்கடி கேட்கப்படுகிறது அகோலைட் உண்மை MAQ
கணித எண்-இலக்கங்கள்

உங்களுக்கு எண்களின் வரம்பு வழங்கப்படுகிறது (தொடக்க, முடிவு). கொடுக்கப்பட்ட பணி ஒரு வரம்பில் மீண்டும் மீண்டும் இலக்கங்கள் இல்லாத மொத்த எண்களைக் கண்டுபிடிக்க கூறுகிறது.

உதாரணமாக

உள்ளீடு:

10 50

வெளியீடு:

37

விளக்கம்:

10 க்கு மீண்டும் மீண்டும் இலக்கமில்லை. 11 மீண்டும் மீண்டும் இலக்கத்தைக் கொண்டுள்ளது. 12 க்கு மீண்டும் மீண்டும் இலக்கமில்லை. அதேசமயம் 22, 33 மீண்டும் மீண்டும் இலக்கத்தைக் கொண்டுள்ளது. எனவே மீண்டும் மீண்டும் இலக்கமில்லாத எண்களைக் கண்டறிந்தால், அதை எங்கள் முடிவில் எண்ணுவோம்.

வரம்பில் மீண்டும் மீண்டும் இலக்கங்கள் இல்லாத மொத்த எண்கள்

அல்காரிதம்

  1. ஒரு அறிவிக்கவும் தொகுப்பு மற்றும் ஒரு திசையன்.
  2. 0 மற்றும் 1 ஐ திசையனுக்குள் தள்ளி, 10 காலத்தின் அனைத்து காரணிகளையும் கண்டுபிடித்து, மீதமுள்ளவற்றை தொகுப்பில் சேமிக்கவும். தொகுப்பில் ஏற்கனவே அந்த எண் திரும்பினால் 0 வேறு 1 திரும்பவும்.
  3. அந்த எண்ணைப் பெற்று அதை சேர்க்கவும் திசையன்.
  4. ஒவ்வொரு வினவலுக்கும், திசையன் [முடிவு] மற்றும் திசையன் [தொடக்க] ஆகியவற்றின் வேறுபாட்டைத் தரவும்.

ஒரு வரம்பில் மீண்டும் மீண்டும் இலக்கங்கள் இல்லாத மொத்த எண்களுக்கான விளக்கம்

நாங்கள் ஒரு வரம்பைக் கொடுத்துள்ளோம். ஒரு குறிப்பிட்ட வரம்பில் வரும் எண்ணின் மொத்த எண்ணிக்கையை கண்டுபிடிக்க மீண்டும் கேட்டுள்ளோம். இதற்காக, சேகரிப்பு கட்டமைப்பைப் பயன்படுத்தப் போகிறோம். நாங்கள் தொகுப்பு மற்றும் திசையன் பயன்படுத்துவோம். செட் என்பது ஒரு எண்ணின் அசாதாரண காரணிகளை அல்லது மீதமுள்ளவற்றை சேமிப்பதும், திசையன் என்பது தொகுப்பிலிருந்து வடிகட்டப்பட்ட எண்ணை சேமிப்பதும் ஆகும். அவற்றில் சில எந்த 10 இலக்க இலக்க இடத்திலிருந்தும் ஒரு எண் மட்டுமே மீண்டும் மீண்டும் செய்யப்படுவதில்லை என்பது எங்களுக்குத் தெரியும், 1 முதல் 10 வரை, மீண்டும் மீண்டும் எண் இல்லை. 11 முதல் 10 வரை மற்றும் 21 முதல் 30 வரை, 11 மற்றும் 22 என இலக்கங்களை மீண்டும் மீண்டும் கொண்ட இரண்டு எண்கள் உள்ளன, இது ஒரே மாதிரியாக செல்கிறது.

0 மற்றும் 1 என்ற எண்ணை திசையனில் சேர்ப்போம், மதிப்பு 2 முதல் கொடுக்கப்பட்ட மதிப்பு வரை, அது எதுவாக இருந்தாலும் சரி. மேலே குறிப்பிட்டுள்ளபடி, 10 அடிப்படையில் ஒரு காரணி அல்லது மீதமுள்ள எண்ணைப் பெறுங்கள். செட் ஏற்கனவே அந்த எண்ணை மீதமுள்ளதாகக் கொண்டிருந்தால், அந்த எஞ்சியுள்ளவற்றைப் பெற்று தொகுப்பில் சேர்ப்போம். 0 ஐத் திருப்பி, மீதமுள்ளதை தொகுப்பில் சேர்க்கவும். இது ஒரு புதிய எண்ணாகவோ அல்லது மீதமுள்ளதாகவோ திரும்பும் 1. மதிப்பு 0 ஆக மாறும் வரை தொடர்ந்து பயணிக்கவும். இங்கே நாம் 0 அல்லது 1 போன்றவற்றிலிருந்து எண்ணைப் பெறுவோம், மேலும் அதை ஒரு திசையன் மூலம் பெறும் எண்ணுடன் சேர்த்து, எண்ணிக்கையைத் தள்ளுங்கள் திசையன் தானே.

ஒவ்வொரு வினவலுக்கும், சரியான நிலையில் உள்ள எண்களின் வேறுபாட்டை நாங்கள் திருப்பித் தருகிறோம், அதாவது சரியான வரம்பு, மற்றும் இடது நிலையில் உள்ள எண்கள் என்பது திசையனின் இடது வரம்பில் உள்ள எண்ணைக் குறிக்கிறது. இந்த வித்தியாசத்தை நாங்கள் திருப்பித் தருவோம், இது எங்களுக்கு தேவையான பதிலாக இருக்கும்.

நடைமுறைப்படுத்தல்

ஒரு வரம்பில் மீண்டும் மீண்டும் இலக்கங்கள் இல்லாத மொத்த எண்களுக்கான சி ++ நிரல்

#include <iostream>
#include<vector>
#include<unordered_set>

using namespace std;

int MAX = 1000;

vector<int> numbers = {0};

int getRepeatedNumber(int n)
{

    unordered_set<int> SET;
    int rem;

    while (n != 0)
    {
        rem = n % 10;
        if (SET.find(rem) != SET.end())
            return 0;

        SET.insert(rem);
        n = n / 10;
    }
    return 1;
}

void buildSetOfNumbers(int MAX)
{

    numbers.push_back(getRepeatedNumber(1));

    for (int i = 2; i < MAX + 1; i++)
        numbers.push_back(getRepeatedNumber(i) + numbers[i-1]);
}

int getNumber(int left,int right)
{
    return numbers[right] - numbers[left-1];
}
int main()
{
    int Left = 10, Right = 50;
    buildSetOfNumbers(MAX);

    cout << getNumber(Left, Right) << endl;

    return 0;
}
37

ஒரு வரம்பில் மீண்டும் மீண்டும் இலக்கங்கள் இல்லாத மொத்த எண்களுக்கான ஜாவா நிரல்

import java.util.Vector;
import java.util.HashSet;

class repeatedDigits
{
    private static int MAX = 100;
    private static Vector<Integer> numbers = new Vector<>();
    
    static int getRepeatedNumber(int n)
    {
        HashSet<Integer> set = new HashSet<>();
        int rem;

        while (n != 0)
        {
            rem = n % 10;

            if (set.contains(rem))
                return 0;

            set.add(rem);
            n /= 10;
        }
        return 1;
    }
    
    static void buildSetOfNumbers()
    {
        numbers.add(0);
        numbers.add(getRepeatedNumber(1));

        for (int i = 2; i < MAX + 1; i++)
            numbers.add(getRepeatedNumber(i) + numbers.elementAt(i - 1));
    }
    
    static int getNumber(int left, int right)
    {
        return numbers.elementAt(right) - numbers.elementAt(left - 1);
    }
    
    public static void main(String[] args)
    {
        int Left = 10, Right = 50;

        buildSetOfNumbers();
        System.out.println(getNumber(Left, Right));
    }
}
37

சிக்கலான பகுப்பாய்வு

நேர சிக்கலானது

ஓ (1) கூடுதல் நேரம் தேவையில்லை.

விண்வெளி சிக்கலானது

ஓ (n) எங்கே “N” என்பது வரிசையில் உள்ள உறுப்புகளின் எண்ணிக்கை.