forked from javadev/LeetCode-in-Kotlin
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
13 changed files
with
455 additions
and
1 deletion.
There are no files selected for viewing
28 changes: 28 additions & 0 deletions
28
src/main/kotlin/g3301_3400/s3345_smallest_divisible_digit_product_i/Solution.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package g3301_3400.s3345_smallest_divisible_digit_product_i | ||
|
||
// #Easy #Math #Enumeration #2024_11_14_Time_1_ms_(100.00%)_Space_33.7_MB_(100.00%) | ||
|
||
class Solution { | ||
fun smallestNumber(n: Int, t: Int): Int { | ||
var num = -1 | ||
var check = n | ||
while (num == -1) { | ||
val product = findProduct(check) | ||
if (product % t == 0) { | ||
num = check | ||
} | ||
check += 1 | ||
} | ||
return num | ||
} | ||
|
||
private fun findProduct(check: Int): Int { | ||
var check = check | ||
var res = 1 | ||
while (check > 0) { | ||
res *= check % 10 | ||
check = check / 10 | ||
} | ||
return res | ||
} | ||
} |
30 changes: 30 additions & 0 deletions
30
src/main/kotlin/g3301_3400/s3345_smallest_divisible_digit_product_i/readme.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
3345\. Smallest Divisible Digit Product I | ||
|
||
Easy | ||
|
||
You are given two integers `n` and `t`. Return the **smallest** number greater than or equal to `n` such that the **product of its digits** is divisible by `t`. | ||
|
||
**Example 1:** | ||
|
||
**Input:** n = 10, t = 2 | ||
|
||
**Output:** 10 | ||
|
||
**Explanation:** | ||
|
||
The digit product of 10 is 0, which is divisible by 2, making it the smallest number greater than or equal to 10 that satisfies the condition. | ||
|
||
**Example 2:** | ||
|
||
**Input:** n = 15, t = 3 | ||
|
||
**Output:** 16 | ||
|
||
**Explanation:** | ||
|
||
The digit product of 16 is 6, which is divisible by 3, making it the smallest number greater than or equal to 15 that satisfies the condition. | ||
|
||
**Constraints:** | ||
|
||
* `1 <= n <= 100` | ||
* `1 <= t <= 10` |
42 changes: 42 additions & 0 deletions
42
...3301_3400/s3346_maximum_frequency_of_an_element_after_performing_operations_i/Solution.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
package g3301_3400.s3346_maximum_frequency_of_an_element_after_performing_operations_i | ||
|
||
// #Medium #Array #Sorting #Binary_Search #Prefix_Sum #Sliding_Window | ||
// #2024_11_14_Time_12_ms_(100.00%)_Space_64.1_MB_(80.00%) | ||
|
||
import kotlin.math.max | ||
import kotlin.math.min | ||
|
||
class Solution { | ||
private fun getMax(nums: IntArray): Int { | ||
var max = nums[0] | ||
for (num in nums) { | ||
max = max(num, max) | ||
} | ||
return max | ||
} | ||
|
||
fun maxFrequency(nums: IntArray, k: Int, numOperations: Int): Int { | ||
val maxNum = getMax(nums) | ||
val n = maxNum + k + 2 | ||
val freq = IntArray(n) | ||
for (num in nums) { | ||
freq[num]++ | ||
} | ||
val pref = IntArray(n) | ||
pref[0] = freq[0] | ||
for (i in 1 until n) { | ||
pref[i] = pref[i - 1] + freq[i] | ||
} | ||
var res = 0 | ||
for (i in 0 until n) { | ||
val left: Int = max(0, (i - k)) | ||
val right: Int = min((n - 1), (i + k)) | ||
var tot = pref[right] | ||
if (left > 0) { | ||
tot -= pref[left - 1] | ||
} | ||
res = max(res, (freq[i] + min(numOperations, (tot - freq[i])))) | ||
} | ||
return res | ||
} | ||
} |
44 changes: 44 additions & 0 deletions
44
...0/s3346_maximum_frequency_of_an_element_after_performing_operations_i/readme.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
3346\. Maximum Frequency of an Element After Performing Operations I | ||
|
||
Medium | ||
|
||
You are given an integer array `nums` and two integers `k` and `numOperations`. | ||
|
||
You must perform an **operation** `numOperations` times on `nums`, where in each operation you: | ||
|
||
* Select an index `i` that was **not** selected in any previous operations. | ||
* Add an integer in the range `[-k, k]` to `nums[i]`. | ||
|
||
Return the **maximum** possible frequency of any element in `nums` after performing the **operations**. | ||
|
||
**Example 1:** | ||
|
||
**Input:** nums = [1,4,5], k = 1, numOperations = 2 | ||
|
||
**Output:** 2 | ||
|
||
**Explanation:** | ||
|
||
We can achieve a maximum frequency of two by: | ||
|
||
* Adding 0 to `nums[1]`. `nums` becomes `[1, 4, 5]`. | ||
* Adding -1 to `nums[2]`. `nums` becomes `[1, 4, 4]`. | ||
|
||
**Example 2:** | ||
|
||
**Input:** nums = [5,11,20,20], k = 5, numOperations = 1 | ||
|
||
**Output:** 2 | ||
|
||
**Explanation:** | ||
|
||
We can achieve a maximum frequency of two by: | ||
|
||
* Adding 0 to `nums[1]`. | ||
|
||
**Constraints:** | ||
|
||
* <code>1 <= nums.length <= 10<sup>5</sup></code> | ||
* <code>1 <= nums[i] <= 10<sup>5</sup></code> | ||
* <code>0 <= k <= 10<sup>5</sup></code> | ||
* `0 <= numOperations <= nums.length` |
42 changes: 42 additions & 0 deletions
42
...301_3400/s3347_maximum_frequency_of_an_element_after_performing_operations_ii/Solution.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
package g3301_3400.s3347_maximum_frequency_of_an_element_after_performing_operations_ii | ||
|
||
// #Hard #Array #Sorting #Binary_Search #Prefix_Sum #Sliding_Window | ||
// #2024_11_14_Time_48_ms_(100.00%)_Space_67.8_MB_(93.33%) | ||
|
||
import kotlin.math.max | ||
import kotlin.math.min | ||
|
||
class Solution { | ||
fun maxFrequency(nums: IntArray, k: Int, numOperations: Int): Int { | ||
nums.sort() | ||
val n = nums.size | ||
var l = 0 | ||
var r = 0 | ||
var i = 0 | ||
var j = 0 | ||
var res = 0 | ||
while (i < n) { | ||
while (j < n && nums[j] == nums[i]) { | ||
j++ | ||
} | ||
while (l < i && nums[i] - nums[l] > k) { | ||
l++ | ||
} | ||
while (r < n && nums[r] - nums[i] <= k) { | ||
r++ | ||
} | ||
res = max(res, (min((i - l + r - j), numOperations) + j - i)) | ||
i = j | ||
} | ||
i = 0 | ||
j = 0 | ||
while (i < n && j < n) { | ||
while (j < n && j - i < numOperations && nums[j] - nums[i] <= k * 2) { | ||
j++ | ||
} | ||
res = max(res, (j - i)) | ||
i++ | ||
} | ||
return res | ||
} | ||
} |
44 changes: 44 additions & 0 deletions
44
.../s3347_maximum_frequency_of_an_element_after_performing_operations_ii/readme.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
3347\. Maximum Frequency of an Element After Performing Operations II | ||
|
||
Hard | ||
|
||
You are given an integer array `nums` and two integers `k` and `numOperations`. | ||
|
||
You must perform an **operation** `numOperations` times on `nums`, where in each operation you: | ||
|
||
* Select an index `i` that was **not** selected in any previous operations. | ||
* Add an integer in the range `[-k, k]` to `nums[i]`. | ||
|
||
Return the **maximum** possible frequency of any element in `nums` after performing the **operations**. | ||
|
||
**Example 1:** | ||
|
||
**Input:** nums = [1,4,5], k = 1, numOperations = 2 | ||
|
||
**Output:** 2 | ||
|
||
**Explanation:** | ||
|
||
We can achieve a maximum frequency of two by: | ||
|
||
* Adding 0 to `nums[1]`, after which `nums` becomes `[1, 4, 5]`. | ||
* Adding -1 to `nums[2]`, after which `nums` becomes `[1, 4, 4]`. | ||
|
||
**Example 2:** | ||
|
||
**Input:** nums = [5,11,20,20], k = 5, numOperations = 1 | ||
|
||
**Output:** 2 | ||
|
||
**Explanation:** | ||
|
||
We can achieve a maximum frequency of two by: | ||
|
||
* Adding 0 to `nums[1]`. | ||
|
||
**Constraints:** | ||
|
||
* <code>1 <= nums.length <= 10<sup>5</sup></code> | ||
* <code>1 <= nums[i] <= 10<sup>9</sup></code> | ||
* <code>0 <= k <= 10<sup>9</sup></code> | ||
* `0 <= numOperations <= nums.length` |
77 changes: 77 additions & 0 deletions
77
src/main/kotlin/g3301_3400/s3348_smallest_divisible_digit_product_ii/Solution.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
package g3301_3400.s3348_smallest_divisible_digit_product_ii | ||
|
||
// #Hard #String #Math #Greedy #Backtracking #Number_Theory | ||
// #2024_11_14_Time_46_ms_(100.00%)_Space_48.2_MB_(100.00%) | ||
|
||
class Solution { | ||
fun smallestNumber(num: String, t: Long): String { | ||
var t = t | ||
var tmp = t | ||
for (i in 9 downTo 2) { | ||
while (tmp % i == 0L) { | ||
tmp /= i.toLong() | ||
} | ||
} | ||
if (tmp > 1) { | ||
return "-1" | ||
} | ||
val s = num.toCharArray() | ||
val n = s.size | ||
val leftT = LongArray(n + 1) | ||
leftT[0] = t | ||
var i0 = n - 1 | ||
for (i in 0 until n) { | ||
if (s[i] == '0') { | ||
i0 = i | ||
break | ||
} | ||
leftT[i + 1] = leftT[i] / gcd(leftT[i], s[i].code.toLong() - '0'.code.toLong()) | ||
} | ||
if (leftT[n] == 1L) { | ||
return num | ||
} | ||
for (i in i0 downTo 0) { | ||
while (++s[i] <= '9') { | ||
var tt = leftT[i] / gcd(leftT[i], s[i].code.toLong() - '0'.code.toLong()) | ||
for (j in n - 1 downTo i + 1) { | ||
if (tt == 1L) { | ||
s[j] = '1' | ||
continue | ||
} | ||
for (k in 9 downTo 2) { | ||
if (tt % k == 0L) { | ||
s[j] = ('0'.code + k).toChar() | ||
tt /= k.toLong() | ||
break | ||
} | ||
} | ||
} | ||
if (tt == 1L) { | ||
return String(s) | ||
} | ||
} | ||
} | ||
val ans = StringBuilder() | ||
for (i in 9 downTo 2) { | ||
while (t % i == 0L) { | ||
ans.append(('0'.code + i).toChar()) | ||
t /= i.toLong() | ||
} | ||
} | ||
while (ans.length <= n) { | ||
ans.append('1') | ||
} | ||
return ans.reverse().toString() | ||
} | ||
|
||
private fun gcd(a: Long, b: Long): Long { | ||
var a = a | ||
var b = b | ||
while (a != 0L) { | ||
val tmp = a | ||
a = b % a | ||
b = tmp | ||
} | ||
return b | ||
} | ||
} |
46 changes: 46 additions & 0 deletions
46
src/main/kotlin/g3301_3400/s3348_smallest_divisible_digit_product_ii/readme.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
3348\. Smallest Divisible Digit Product II | ||
|
||
Hard | ||
|
||
You are given a string `num` which represents a **positive** integer, and an integer `t`. | ||
|
||
A number is called **zero-free** if _none_ of its digits are 0. | ||
|
||
Return a string representing the **smallest** **zero-free** number greater than or equal to `num` such that the **product of its digits** is divisible by `t`. If no such number exists, return `"-1"`. | ||
|
||
**Example 1:** | ||
|
||
**Input:** num = "1234", t = 256 | ||
|
||
**Output:** "1488" | ||
|
||
**Explanation:** | ||
|
||
The smallest zero-free number that is greater than 1234 and has the product of its digits divisible by 256 is 1488, with the product of its digits equal to 256. | ||
|
||
**Example 2:** | ||
|
||
**Input:** num = "12355", t = 50 | ||
|
||
**Output:** "12355" | ||
|
||
**Explanation:** | ||
|
||
12355 is already zero-free and has the product of its digits divisible by 50, with the product of its digits equal to 150. | ||
|
||
**Example 3:** | ||
|
||
**Input:** num = "11111", t = 26 | ||
|
||
**Output:** "-1" | ||
|
||
**Explanation:** | ||
|
||
No number greater than 11111 has the product of its digits divisible by 26. | ||
|
||
**Constraints:** | ||
|
||
* <code>2 <= num.length <= 2 * 10<sup>5</sup></code> | ||
* `num` consists only of digits in the range `['0', '9']`. | ||
* `num` does not contain leading zeros. | ||
* <code>1 <= t <= 10<sup>14</sup></code> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 17 additions & 0 deletions
17
src/test/kotlin/g3301_3400/s3345_smallest_divisible_digit_product_i/SolutionTest.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package g3301_3400.s3345_smallest_divisible_digit_product_i | ||
|
||
import org.hamcrest.CoreMatchers.equalTo | ||
import org.hamcrest.MatcherAssert.assertThat | ||
import org.junit.jupiter.api.Test | ||
|
||
internal class SolutionTest { | ||
@Test | ||
fun smallestNumber() { | ||
assertThat<Int>(Solution().smallestNumber(10, 2), equalTo<Int>(10)) | ||
} | ||
|
||
@Test | ||
fun smallestNumber2() { | ||
assertThat<Int>(Solution().smallestNumber(15, 3), equalTo<Int>(16)) | ||
} | ||
} |
Oops, something went wrong.