გადააქციეთ რიცხვი თექვსმეტობითი Leetcode ამონახსნად


Რთული ტური Easy
ხშირად ეკითხებიან Facebook microsoft
ბიტის მანიპულირება

პრობლემა შეცვლის ნომერს თექვსმეტობითი Leetcode ამოხსნა გვაძლევს მთელ რიცხვს. შემდეგ გვთხოვს მოცემულის გარდაქმნას მთელი რიცხვი ათობითი რიცხვების სისტემაში თექვსმეტობითი რიცხვის სისტემაში. უფრო ფორმალურად, კითხვა მოითხოვს ჩვენგან, რომ 10 ბაზაში მოცემული მთელი რიცხვი ბაზის 16 წარმოდგენაში გადავიყვანოთ. ჩვენ უკვე გადავწყვიტეთ პრობლემა, სადაც ათობითი რიცხვების სისტემაში მოგვცეს რიცხვი. და უნდა გადამეყვანებინა იგი ბაზაზე 7. ასე რომ, სანამ შემდგომში გადავალთ, მოდით გაეცნოთ რამდენიმე მაგალითს.

მაგალითი

26
1a

გადააქციეთ რიცხვი თექვსმეტობითი Leetcode ამონახსნად

განმარტება: ეს გარდაქმნა მარტივია, თუ უნდა იცოდეთ თექვსმეტობითი რიცხვითი სისტემის შესახებ. მაგრამ თუ ამის შესახებ არ იცით, უბრალოდ მოცემული რიცხვი გადაიყვანეთ 16 ფუძის წარმოდგენაში. ჩვენ ამას ვაკეთებთ განმეორებითი დაყოფით და დარჩენილი ნაწილის შენახვით. ერთი რამ უნდა აღინიშნოს, რომ 10 წარმოდგენილია თექვსმეტობითი აღნიშვნით 'a' - ს გამოყენებით.

-1
ffffffff

განმარტება: ვინაიდან უარყოფითი რიცხვები ინახება, როგორც მათი 2-ის დამატებული აღნიშვნა. -1 მისი 2s კომპლემენტის აღნიშვნაა 11111111111111111111111111111111. ამრიგად, ჩვენ ამას ვაქცევთ თექვსმეტობით, რაც ნაჩვენებია გამომავალში.

რიცხვის თექვსმეტობითი Leetcode ამოხსნად გადაქცევის მიდგომა

პრობლემის სიღრმეში ჩასვლამდე გადაიყვანეთ რიცხვი თექვსმეტობითი Leetcode ამოხსნად. ჯერ გავეცნოთ თექვსმეტობითი რიცხვითი სისტემის. ასე რომ, თექვსმეტობითი რიცხვითი სისტემა ასევე ჰგავს ათობითი რიცხვების სისტემას, მაგრამ ციფრები 10-დან 15-მდე წარმოდგენილია მცირე ანბანის გამოყენებით 'a' -დან 'f'. ასე რომ, ჩვენ შეგვიძლია უბრალოდ გადავიყვანოთ მთელი რიცხვი ათობითი რიცხვის სისტემაში, რომ წარმოვადგინოთ 16 წარმოდგენა. გარდაქმნის შემდეგ, ჩვენ უბრალოდ ვცვლით 10 - 15 რიცხვებს a - f. მაგრამ რა, ნეგატიურ რიცხვებს ვაკეთებთ? მას შემდეგ, რაც უარყოფითი რიცხვები ინახება 2s- ში, შეავსებს ორობითი სისტემაში. ჩვენ უბრალოდ ვინახავთ რიცხვს ხელმოუწერელ int- ში და უბრალოდ ვაქცევთ 16 ფუძედ.

Java ენაზე კოდი ასევე ასრულებს ერთსა და იმავეს, მაგრამ ხორციელდება ცოტა განსხვავებული მეთოდით, bit მანიპულირების გამოყენებით. პირველ რიგში, ჩვენ ავიღებთ & მოცემულ რიცხვს 15.-ით. ეს ოპერაცია ექვივალენტურია mod- ის 16-ის აღებას, შემდეგ კი მარცხენა ცვლის გამოყენება უდრის გაყოფას 16-ის გამოყენებით.

კოდი

C ++ კოდი ციფრის თექვსმეტობითი Leetcode ამოხსნად გადასაყვანად

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

const string decToHex = "0123456789abcdef";

string toHex(int n){
    if(n==0)
        return "0";
    unsigned int num = n;
    string ans = "";
    while(num > 0){
        ans = decToHex[num%16] + ans;
        num /= 16;
    }
    return ans;
}

int main(){
    cout<<toHex(26);
}
1a

ჯავის კოდი ციფრის თექვსმეტობითი Leetcode ამოხსნად გადასაყვანად

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

class Solution
{
  public static String toHex(int n) {
        String decToHex = "0123456789abcdef";
        if(n==0)
            return "0";
        int num = n;
        String ans = "";
        while(num != 0){
            ans = decToHex.charAt(num&15) + ans;
            num = num >>> 4;
        }
        return ans;
    }
    
  public static void main (String[] args) throws java.lang.Exception
  {
    System.out.print(toHex(-1));
  }
}
ffffffff

სირთულის ანალიზი

დროის სირთულე

O (M (n) log n), სადაც n მოცემული შეყვანის სიგრძეა, M (n) არის ორი 2-ბიტიანი რიცხვის გაყოფის დრო. ასე რომ, დროის სირთულე ლოგარითმულია.

სივრცის სირთულე

O (1), ვინაიდან ჩვენ არ გვქონდა შენახული მონაცემები ნომრის თითოეულ ციფრთან დაკავშირებით. სივრცის სირთულე მუდმივია.