You are given an integer N. You have to find smallest multiple of N which consists of digits 0 and 1 only. Since this multiple could be large, return it in form of a string.
Note:
Returned string should not contain leading zeroes.
For example,
For N = 55, 110 is smallest multiple consisting of digits 0 and 1.
For N = 2, 10 is the answer.
Solution:
import java.math.BigInteger;
public class Solution { private boolean isMultiple(BigInteger n, int A) { BigInteger divider = new BigInteger(String.valueOf(A)); if (n.mod(divider).equals(BigInteger.ZERO)) { return true; } return false; }
public String multiple(int A) { Deque<StringBuilder> queue = new ArrayDeque<>(); StringBuilder sb = new StringBuilder(); sb.append("1"); queue.offer(sb); while (!queue.isEmpty()) { StringBuilder curr = queue.poll(); BigInteger n = new BigInteger(curr.toString()); if (isMultiple(n, A)) { return curr.toString(); } StringBuilder addOne = new StringBuilder(curr.toString()); curr.append("0"); queue.offer(curr); addOne.append("1"); queue.offer(addOne); } return ""; } }
Space optimized:
public class Solution { public String multiple(int A) { if (A == 1) return "1"; Deque<Integer> queue = new ArrayDeque<>();
int[] parent = new int[A]; int[] state = new int[A]; int[] steps = new int[]{0, 1}; for (int i = 0; i < A; i ++) { parent[i] = -1; state[i] = -1; } queue.offer(1); while (!queue.isEmpty()) { int curr = queue.poll(); if (curr == 0) { break; } for(int step: steps) { int next = (curr * 10 + step) % A; if(parent[next] == -1){ parent[next] = curr; state[next] = step; queue.offer(next); } } } StringBuilder sb = new StringBuilder(); int s = 0; while (s != 1) { sb.append(String.valueOf(state[s])); s = parent[s]; } sb.append("1"); return sb.reverse().toString(); } }