← Static tasks

405. Convert a Number to Hexadecimal

leetcode easy

#array#bit-manipulation#csharp#easy#leetcode#string

Task

Если задано целое число num, верните строку, представляющую его шестнадцатеричное представление. Для отрицательных целых чисел используется метод дополнения до двух. Все буквы в строке ответа должны быть строчными, и в ответе не должно быть никаких ведущих нулей, кроме самого нуля. Примечание: Вам не разрешается использовать какие-либо встроенные библиотечные методы для непосредственного решения этой задачи.

Пример:

Input: num = 26

Output: "1a"

C# solution

matched/original
public class Solution {
    public string ToHex(int num) {
        if (num == 0) return "0";
        char[] hexChars = "0123456789abcdef".ToCharArray();
        uint n = (uint)num;
        StringBuilder result = new StringBuilder();
        while (n > 0) {
            result.Append(hexChars[n % 16]);
            n /= 16;
        }
        char[] charArray = result.ToString().ToCharArray();
        Array.Reverse(charArray);
        return new string(charArray);
    }
}

C++ solution

auto-draft, review before submit
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public string ToHex(int num) {
        if (num == 0) return "0";
        char[] hexChars = "0123456789abcdef".ToCharArray();
        uint n = (uint)num;
        StringBuilder result = new StringBuilder();
        while (n > 0) {
            result.Append(hexChars[n % 16]);
            n /= 16;
        }
        char[] charArray = result.ToString().ToCharArray();
        Array.Reverse(charArray);
        return new string(charArray);
    }
}

Java solution

matched/original
public class Solution {
    public String toHex(int num) {
        if (num == 0) return "0";
        char[] hexChars = "0123456789abcdef".toCharArray();
        long n = num;
        if (num < 0) n += 1L << 32;
        StringBuilder result = new StringBuilder();
        while (n > 0) {
            result.append(hexChars[(int)(n % 16)]);
            n /= 16;
        }
        return result.reverse().toString();
    }
}

JavaScript solution

matched/original
function toHex(num) {
    if (num === 0) return "0";
    let hexChars = "0123456789abcdef";
    if (num < 0) num += 2 ** 32;
    let result = [];
    while (num > 0) {
        result.push(hexChars[num % 16]);
        num = Math.floor(num / 16);
    }
    return result.reverse().join('');
}

Python solution

matched/original
def to_hex(num):
    if num == 0:
        return "0"
    hex_chars = "0123456789abcdef"
    if num < 0:
        num += 2 ** 32
    result = []
    while num > 0:
        result.append(hex_chars[num % 16])
        num //= 16
    return ''.join(result[::-1])

Go solution

matched/original
package main

import (
    "fmt"
    "strings"
)

func toHex(num int) string {
    if num == 0 {
        return "0"
    }
    hexChars := "0123456789abcdef"
    if num < 0 {
        num += 1 << 32
    }
    result := []byte{}
    for num > 0 {
        result = append(result, hexChars[num%16])
        num /= 16
    }
    for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 {
        result[i], result[j] = result[j], result[i]
    }
    return string(result)
}

func main() {
    fmt.Println(toHex(26))
    fmt.Println(toHex(-1))
}

Explanation

Algorithm

Определите, является ли число отрицательным. Если да, преобразуйте его в положительное число с помощью метода дополнения до двух. Для этого прибавьте к числу 2^32 и используйте битовую операцию И с маской 0xFFFFFFFF.

Создайте строку с шестнадцатеричными символами. Последовательно делите число на 16 и добавляйте соответствующий символ к результату, пока число не станет равным нулю.

Переверните строку результата и удалите ведущие нули, если они есть. Если строка пустая, верните "0".

😎