906. Super Palindromes

LeetCode hard original: C# #array #csharp #hard #leetcode #string #two-pointers
선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.

Если задан 정수 배열 nums, переместите все четные числа в начало 배열а, а затем все нечетные. return любой 배열, удовлетворяющий этому условию.

예제:

Input: left = "4", right = "1000"

Output: 4

C# 해법

매칭됨/원본
public class Solution {
    private bool IsPalindrome(long x) {
        string s = x.ToString();
        char[] arr = s.ToCharArray();
        Array.Reverse(arr);
        return s == new string(arr);
    }
    public int SuperpalindromesInRange(string left, string right) {
        long leftNum = long.Parse(left);
        long rightNum = long.Parse(right);
        int count = 0;
        for (int i = 1; i < 100000; i++) {
            string s = i.ToString();
            long palin1 = long.Parse(s + new string(s.Reverse().ToArray()));
            long palin2 = long.Parse(s + new string(s.Reverse().Skip(1).ToArray()));
            if (palin1 * palin1 > rightNum) {
                break;
            }
            if (palin1 * palin1 >= leftNum && IsPalindrome(palin1 * palin1)) {
                count++;
            }
            if (palin2 * palin2 >= leftNum && palin2 * palin2 <= rightNum && IsPalindrome(palin2 * palin2)) {
                count++;
            }
        }
        return count;
    }
}

C++ 해법

자동 초안, 제출 전 검토
#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:
    private bool IsPalindrome(long x) {
        string s = x.ToString();
        char[] arr = s.ToCharArray();
        Array.Reverse(arr);
        return s == new string(arr);
    }
    public int SuperpalindromesInRange(string left, string right) {
        long leftNum = long.Parse(left);
        long rightNum = long.Parse(right);
        int count = 0;
        for (int i = 1; i < 100000; i++) {
            string s = i.ToString();
            long palin1 = long.Parse(s + new string(s.Reverse().ToArray()));
            long palin2 = long.Parse(s + new string(s.Reverse().Skip(1).ToArray()));
            if (palin1 * palin1 > rightNum) {
                break;
            }
            if (palin1 * palin1 >= leftNum && IsPalindrome(palin1 * palin1)) {
                count++;
            }
            if (palin2 * palin2 >= leftNum && palin2 * palin2 <= rightNum && IsPalindrome(palin2 * palin2)) {
                count++;
            }
        }
        return count;
    }
}

Java 해법

매칭됨/원본
class Solution {
    private boolean isPalindrome(long x) {
        String s = Long.toString(x);
        return s.equals(new StringBuilder(s).reverse().toString());
    }

    public int superpalindromesInRange(String left, String right) {
        long leftNum = Long.parseLong(left);
        long rightNum = Long.parseLong(right);
        int count = 0;

        for (int i = 1; i < 100000; i++) {
            String s = Integer.toString(i);
            long palin1 = Long.parseLong(s + new StringBuilder(s).reverse().toString());
            long palin2 = Long.parseLong(s + new StringBuilder(s.substring(0, s.length() - 1)).reverse().toString());

            if (palin1 * palin1 > rightNum) {
                break;
            }
            if (palin1 * palin1 >= leftNum && isPalindrome(palin1 * palin1)) {
                count++;
            }
            if (palin2 * palin2 >= leftNum && palin2 * palin2 <= rightNum && isPalindrome(palin2 * palin2)) {
                count++;
            }
        }

        return count;
    }
}

Python 해법

매칭됨/원본
def is_palindrome(x):
    return str(x) == str(x)[::-1]

def superpalindromesInRange(left, right):
    left, right = int(left), int(right)
    count = 0
    max_root = int(right**0.5) + 1

    for i in range(1, 100000):
        s = str(i)
        palin1 = int(s + s[::-1])
        palin2 = int(s + s[-2::-1])

        if palin1**2 > right:
            break
        if palin1**2 >= left and is_palindrome(palin1**2):
            count += 1
        if palin2**2 >= left and palin2**2 <= right and is_palindrome(palin2**2):
            count += 1

    return count

Go 해법

매칭됨/원본
public class Solution {
    private bool IsPalindrome(long x) {
        string s = x.ToString();
        char[] arr = s.ToCharArray();
        Array.Reverse(arr);
        return s == new string(arr);
    }

    public int SuperpalindromesInRange(string left, string right) {
        long leftNum = long.Parse(left);
        long rightNum = long.Parse(right);
        int count = 0;

        for (int i = 1; i < 100000; i++) {
            string s = i.ToString();
            long palin1 = long.Parse(s + new string(s.Reverse().ToArray()));
            long palin2 = long.Parse(s + new string(s.Reverse().Skip(1).ToArray()));

            if (palin1 * palin1 > rightNum) {
                break;
            }
            if (palin1 * palin1 >= leftNum && IsPalindrome(palin1 * palin1)) {
                count++;
            }
            if (palin2 * palin2 >= leftNum && palin2 * palin2 <= rightNum && IsPalindrome(palin2 * palin2)) {
                count++;
            }
        }

        return count;
    }
}

Algorithm

find все палиндромы до корня из right.

Проверить, являются ли квадраты этих палиндромов палиндромами и лежат ли в диапазоне [left, right].

Подсчитать количество таких суперпалиндромов.

😎

Vacancies for this task

활성 채용 with overlapping task tags are 표시됨.

전체 채용
아직 활성 채용이 없습니다.