Skip to content

Added tasks 3345-3348 #719

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Nov 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
}
}
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`
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
}
}
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`
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
}
}
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`
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
}
}
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>
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ internal class FizzBuzzTest {
}
}
.start()
TimeUnit.MILLISECONDS.sleep(1600)
TimeUnit.MILLISECONDS.sleep(2000)
assertThat(fizz[0] > 0, equalTo(true))
}

Expand Down
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))
}
}
Loading