Skip to content

Commit 1807806

Browse files
author
2025
committed
Update
1 parent f22f1ed commit 1807806

12 files changed

Lines changed: 288 additions & 0 deletions

File tree

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
[35. Search Insert Position](src/main/java/org/example/g0001_0100/s0035_search_insert_position)   
3434
[69. Sqrtx](src/main/java/org/example/g0001_0100/s0069_sqrtx)   
3535
[108. Convert Sorted Array To Binary Search Tree](src/main/java/org/example/g0101_0200/s0108_convert_sorted_array_to_binary_search_tree)   
36+
[367. Valid Perfect Square](src/main/java/org/example/g0301_0400/s0367_valid_perfect_square)   
3637
<br><br>
3738

3839

@@ -87,6 +88,8 @@
8788
в обоих направлениях.
8889
Цифровой корень числа — это однозначное число, которое получается путём
8990
последовательного сложения всех цифр исходного числа, пока не останется одна цифра.
91+
Полный квадрат — это целое число, которое является квадратом
92+
другого целого числа
9093
<br>
9194
[9. Palindrome number](src/main/java/org/example/g0001_0100/s0009_palindrome_number) &nbsp;&nbsp;
9295
[69. Sqrtx](src/main/java/org/example/g0001_0100/s0069_sqrtx) &nbsp;&nbsp;
@@ -98,6 +101,7 @@
98101
[292. Nim Game](src/main/java/org/example/g0201_0300/s0292_nim_game) &nbsp;&nbsp;
99102
[326. Power Of Three](src/main/java/org/example/g0301_0400/s0326_power_of_three) &nbsp;&nbsp;
100103
[342. Power Of Four](src/main/java/org/example/g0301_0400/s0342_power_of_four) &nbsp;&nbsp;
104+
[367. Valid Perfect Square](src/main/java/org/example/g0301_0400/s0367_valid_perfect_square) &nbsp;&nbsp;
101105
[1025. Divisor game](src/main/java/org/example/g1001_1100/s1025_divisor_game) &nbsp;&nbsp;
102106
<br><br>
103107

info/idea.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,8 @@
2020
Например, название задачи, метки, описание задачи (на русском или
2121
английском) Может быть делать отдельные файлы типа description
2222
для таких описаний? или json
23+
24+
25+
Может быть имеет смысл сделать com.example.problems
26+
если нужно будет в этом же проекте делать java код
27+
для обработки задач
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.example.g0301_0400.s0367_valid_perfect_square;
2+
3+
/**
4+
* Дано положительное целое число num.
5+
* Необходимо определить, является ли оно полным квадратом
6+
* (perfect square) без использования встроенной функции вычисления
7+
* квадратного корня.
8+
*
9+
* Полный квадрат — это целое число, которое является квадратом
10+
* другого целого числа. Например:
11+
* Input: 16
12+
* Output: true
13+
* Explanation: 4 × 4 = 16
14+
*
15+
* Input: 14
16+
* Output: false
17+
* Explanation: 3 × 3 = 9 < 14 < 16 = 4 × 4
18+
*
19+
* Подход к решению: бинарный поиск
20+
*/
21+
class Solution {
22+
public boolean isPerfectSquare(int num) {
23+
if (num < 1) return false;
24+
25+
long left = 1;
26+
long right = num;
27+
28+
while (left <= right) {
29+
long mid = left + (right - left) / 2;
30+
long square = mid * mid;
31+
32+
if (square == num) {
33+
return true;
34+
} else if (square < num) {
35+
left = mid + 1;
36+
} else {
37+
right = mid - 1;
38+
}
39+
}
40+
return false;
41+
}
42+
}
43+
/*
44+
Объяснение:
45+
Инициализируем границы поиска: left=1, right=num
46+
Находим середину диапазона (mid)
47+
Сравниваем квадрат mid с num:
48+
Если равен — нашли ответ
49+
Если меньше — ищем в правой половине
50+
Если больше — ищем в левой половине
51+
Используем long для избежания переполнения при умножении
52+
*/
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.example.g0301_0400.s0367_valid_perfect_square;
2+
3+
/**
4+
* Решение с использованием математических свойств
5+
*/
6+
class Solution2 {
7+
public boolean isPerfectSquare(int num) {
8+
if (num < 1) return false;
9+
10+
int i = 1;
11+
while (num > 0) {
12+
num -= i;
13+
i += 2;
14+
}
15+
return num == 0;
16+
}
17+
}
18+
/*
19+
Объяснение
20+
Основано на математическом свойстве:
21+
1² = 1
22+
2² = 1 + 3
23+
3² = 1 + 3 + 5
24+
n² = 1 + 3 + 5 + ... + (2n-1)
25+
*/
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.example.g0301_0400.s0367_valid_perfect_square;
2+
3+
4+
/**
5+
* Простой подход - линейный поиск
6+
*/
7+
class Solution3 {
8+
public boolean isPerfectSquare(int num) {
9+
if (num < 1) return false;
10+
11+
for (int i = 1; i <= num / i; i++) {
12+
if (i * i == num) {
13+
return true;
14+
}
15+
}
16+
return false;
17+
}
18+
}
19+
/*
20+
Объяснение:
21+
Проверяем числа от 1 до √num (приблизительно num/i)
22+
Если находим число, квадрат которого равен num — возвращаем true
23+
Если цикл завершился без нахождения — возвращаем false
24+
*/
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
367\. Valid Perfect Square
2+
3+
Easy
4+
Given a **positive** integer _num_, write a function which returns True if _num_ is a perfect square else False.
5+
**Follow up:** **Do not** use any built-in library function such as `sqrt`.
6+
7+
**Example 1:**
8+
**Input:** num = 16
9+
**Output:** true
10+
11+
**Example 2:**
12+
**Input:** num = 14
13+
**Output:** false
14+
15+
**Constraints:**
16+
17+
* `1 <= num <= 2^31 - 1`
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
Сравнение подходов
2+
Линейный поиск:
3+
Прост в реализации
4+
Временная сложность: O(√n)
5+
Подходит только для небольших чисел
6+
7+
Бинарный поиск:
8+
Оптимальная производительность
9+
Временная сложность: O(log n)
10+
Рекомендуемый метод
11+
12+
Математический трюк:
13+
Интересный математический подход
14+
Временная сложность: O(√n)
15+
Менее эффективен чем бинарный поиск
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.example.g0401_0500.s0405_convert_a_number_to_hexadecimal;
2+
/**
3+
* Дано целое число. Необходимо преобразовать его в шестнадцатеричное (hex)
4+
* представление. Для отрицательных чисел следует использовать
5+
* дополнение до двух.
6+
*
7+
* Особенности:
8+
* Нельзя использовать встроенные функции преобразования
9+
* Все буквы в результате должны быть строчными
10+
* Не должно быть ведущих нулей (кроме самого нуля)
11+
*
12+
* Примеры:
13+
* Input: 26
14+
* Output: "1a"
15+
*
16+
* Input: -1
17+
* Output: "ffffffff"
18+
*
19+
* Решение: Итеративный подход с битовыи операциями
20+
*
21+
* todo разобраться подробнее
22+
*/
23+
class Solution {
24+
public String toHex(int num) {
25+
if (num == 0) return "0";
26+
27+
char[] hexChars = "0123456789abcdef".toCharArray();
28+
StringBuilder result = new StringBuilder();
29+
30+
while (num != 0) {
31+
// Получаем последние 4 бита
32+
int digit = num & 0xf;
33+
result.append(hexChars[digit]);
34+
// Арифметический сдвиг вправо на 4 бита
35+
num >>>= 4;
36+
}
37+
38+
return result.reverse().toString();
39+
}
40+
}
41+
/*
42+
Объяснение:
43+
Особый случай: если число 0, сразу возвращаем "0"
44+
Массив символов: содержит все hex-цифры
45+
46+
Цикл обработки:
47+
Извлекаем последние 4 бита (num & 0xf)
48+
Находим соответствующий символ
49+
Сдвигаем число на 4 бита вправо (>>> - беззнаковый сдвиг)
50+
Реверс результата: так как цифры добавлялись с конца
51+
*/
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.example.g0401_0500.s0405_convert_a_number_to_hexadecimal;
2+
3+
/**
4+
* Обработка по 4 бита с фиксированным циклом
5+
* Фиксированный цикл на 8 итераций (32 бита / 4 бита за раз)
6+
*/
7+
class Solution2 {
8+
public String toHex(int num) {
9+
if (num == 0) return "0";
10+
11+
char[] map = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
12+
StringBuilder sb = new StringBuilder();
13+
14+
for (int i = 0; i < 8 && num != 0; i++) {
15+
sb.append(map[num & 0xf]);
16+
num >>>= 4;
17+
}
18+
19+
return sb.reverse().toString();
20+
}
21+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.example.g0401_0500.s0405_convert_a_number_to_hexadecimal;
2+
3+
4+
/**
5+
* Еще один похожий вариант
6+
*/
7+
public class Solution3 {
8+
public String toHex(int num) {
9+
if (num == 0) {
10+
return "0";
11+
}
12+
StringBuilder sb = new StringBuilder();
13+
int x;
14+
while (num != 0) {
15+
x = num & 0xf;
16+
if (x < 10) {
17+
sb.append(x);
18+
} else {
19+
sb.append((char) (x + 87));
20+
}
21+
num = num >>> 4;
22+
}
23+
return sb.reverse().toString();
24+
}
25+
}

0 commit comments

Comments
 (0)