Divisible Numbers - Amazon Top Interview Questions
Problem Statement :
You are given integers n, a, b, and c. Return the nth (0-indexed) term of the sorted sequence of integers divisible by a, b or c. Note that by convention the first term of any sequence always starts with 1. Example 1 Input n = 8 a = 2 b = 5 c = 7 Output 12 Explanation The first 9 terms of the sequence are [1, 2, 4, 5, 6, 7, 8, 10, 12]
Solution :
Solution in C++ :
class Solution {
public:
int lcm(int x, int y) {
return x * y / __gcd(x, y);
}
int a, b, c;
int lesser(int n) {
// how many elements less than it?
return n / a + n / b + n / c - n / lcm(a, b) - n / lcm(b, c) - n / lcm(a, c) +
n / lcm(a, lcm(b, c));
}
int solve(int n, int a, int b, int c) {
this->a = a, this->b = b, this->c = c;
int l = 1, r = INT_MAX;
while (l < r) {
int guess = l + (r - l) / 2;
// i want the first value with >=n elements lesser than it!
if (lesser(guess) >= n) {
r = guess;
} else {
l = guess + 1;
// guess is not the answer! +1 it
}
}
return l;
}
};
int solve(int n, int a, int b, int c) {
return (new Solution())->solve(n, a, b, c);
}
Solution in Java :
import java.util.*;
class Solution {
public int solve(int n, int a, int b, int c) {
int x = 1, y = 1, z = 1;
int ans = 1;
while (n-- > 0) {
int xx = a * x;
int yy = b * y;
int zz = c * z;
ans = Math.min(xx, Math.min(yy, zz));
if (ans == xx) {
x++;
}
if (ans == yy) {
y++;
}
if (ans == zz) {
z++;
}
}
return ans;
}
}
Solution in Python :
class Solution:
def find_points(self, goal, a, b, c, ab, ac, bc, abc):
total = 0
for item in (a, b, c, abc):
total += goal // item
for item in (ab, ac, bc):
total -= goal // item
return total
def solve(self, n, a, b, c):
if n == 0:
return 1
lcm_ab = a * b // gcd(a, b)
lcm_ac = a * c // gcd(a, c)
lcm_bc = b * c // gcd(b, c)
lcm_abc = lcm_ab * c // gcd(lcm_ab, c)
points = self.find_points(lcm_abc, a, b, c, lcm_ab, lcm_ac, lcm_bc, lcm_abc)
total = n // points * lcm_abc
if n % points == 0:
return total
goal = n % points
approx = int(lcm_abc / points * goal)
approx -= min(approx % a, approx % b, approx % c)
calc = 0
while calc != goal:
calc = self.find_points(approx, a, b, c, lcm_ab, lcm_ac, lcm_bc, lcm_abc)
if calc > goal:
approx -= 1
approx -= min(approx % a, approx % b, approx % c)
if calc < goal:
approx += min(a - approx % a, b - approx % b, c - approx % c)
return total + approx
View More Similar Problems
Tree: Preorder Traversal
Complete the preorder function in the editor below, which has 1 parameter: a pointer to the root of a binary tree. It must print the values in the tree's preorder traversal as a single line of space-separated values. Input Format Our test code passes the root node of a binary tree to the preOrder function. Constraints 1 <= Nodes in the tree <= 500 Output Format Print the tree's
View Solution →Tree: Postorder Traversal
Complete the postorder function in the editor below. It received 1 parameter: a pointer to the root of a binary tree. It must print the values in the tree's postorder traversal as a single line of space-separated values. Input Format Our test code passes the root node of a binary tree to the postorder function. Constraints 1 <= Nodes in the tree <= 500 Output Format Print the
View Solution →Tree: Inorder Traversal
In this challenge, you are required to implement inorder traversal of a tree. Complete the inorder function in your editor below, which has 1 parameter: a pointer to the root of a binary tree. It must print the values in the tree's inorder traversal as a single line of space-separated values. Input Format Our hidden tester code passes the root node of a binary tree to your $inOrder* func
View Solution →Tree: Height of a Binary Tree
The height of a binary tree is the number of edges between the tree's root and its furthest leaf. For example, the following binary tree is of height : image Function Description Complete the getHeight or height function in the editor. It must return the height of a binary tree as an integer. getHeight or height has the following parameter(s): root: a reference to the root of a binary
View Solution →Tree : Top View
Given a pointer to the root of a binary tree, print the top view of the binary tree. The tree as seen from the top the nodes, is called the top view of the tree. For example : 1 \ 2 \ 5 / \ 3 6 \ 4 Top View : 1 -> 2 -> 5 -> 6 Complete the function topView and print the resulting values on a single line separated by space.
View Solution →Tree: Level Order Traversal
Given a pointer to the root of a binary tree, you need to print the level order traversal of this tree. In level-order traversal, nodes are visited level by level from left to right. Complete the function levelOrder and print the values in a single line separated by a space. For example: 1 \ 2 \ 5 / \ 3 6 \ 4 F
View Solution →