techpanja
BAN USER- 2of 2 votes
AnswersWrite an application in Java to simulate file system. For e.g. implement commands: ls -l (list contents of director sorted by name), cd .. (to go to parent directory), pwd to return the complete path to current directory etc. It was a 2 hour remote programming test.
- techpanja in United States
Your system will have Directory and Files. A directory can contain files and other directories.| Report Duplicate | Flag | PURGE
Salesforce Software Engineer / Developer - 0of 0 votes
AnswersWrite an application in Java to simulate file system. For e.g. implement commands: ls -l (list contents of director sorted by name), cd .. (to go to parent directory), etc. It was a 2 hour remote programming test.
- techpanja in United States| Report Duplicate | Flag | PURGE
Samsung Software Engineer / Developer - 1of 1 vote
AnswersFind minimum distance between two words (order preserved) in a big string.
- techpanja in United States
For e.g 1. "hello how are you" - distance between "hello" and "you" is 3.
e.g 2. "hello how are hello you" - distance is 1
e.g 3. "you are hello" - distance is -1. Order of "hello" and "you" should be preserved.
e.g 4. "hello how are hello" - distance is -1 since "you" didnt occur even once.| Report Duplicate | Flag | PURGE
Linkedin Software Engineer / Developer - 0of 0 votes
AnswersFind all the repeating sub-string sequence of specified length in a large string sequence. The sequences returned i.e. the output must be sorted alphabetically.
- techpanja in United States
For e.g.
Input String: "ABCACBABC"
repeated sub-string length: 3
Output: ABC
Input String: "ABCABCA"
repeated sub-string length: 2
Output: AB, BC, CA| Report Duplicate | Flag | PURGE
Linkedin Software Engineer / Developer - 0of 0 votes
AnswersReimplement this code so that its results will always be the same, but that it does not cause a stack overflow on large inputs. Your solution must still implement the Folder interface.
Coding
Your class must be named iteration.MyFolder
- techpanja in United Statespackage iteration; import java.util.Queue; public class MyFolder<T, U> implements Folder<T, U> { public U fold(U u, Queue<T> ts, Function2<T, U, U> function) { if(u == null || ts == null || function == null) throw new IllegalArgumentException(); if (ts.isEmpty()) { return u; } // The recursive implementation will overflow the stack for // any data set of real size, your job is to implement a // non-recursive solution // return fold(function.apply(ts.poll(), u), ts, function); return null; } } package iteration; import java.util.Queue; public interface Folder<T, U> { U fold(U u, Queue<T> list, Function2<T, U, U> function); } package iteration; public interface Function2<T, U, R> { R apply(T t, U u); }
| Report Duplicate | Flag | PURGE
Apple Software Engineer / Developer - 0of 0 votes
AnswersPrint an n-ary tree with level. For e.g.
- techpanja in United States0 foo 1 bar baz 2 foobar barfoo Desired output: Level 0: foo Level 1: bar baz Level 2: foobar barfoo class TreeNode { String name; List<TreeNode> getChildren(); } void printLevels(TreeNode root) { // -- CODE-- }
| Report Duplicate | Flag | PURGE
Amazon Software Engineer / Developer - 0of 0 votes
AnswersThere are two methods printA inside Class A and printB inside class B. printA is a static method and printB is a non-static method. Both the methods are synchronized. There exact 100 million threads fired on both printA and printB each. Which method execution will take less time?
- techpanja in United Statespublic class A { public static void synchronized printA() { ...////..... } } public class B { public void synchronized printB() { ...////..... } }
| Report Duplicate | Flag | PURGE
Amazon Software Engineer / Developer Threads - 2of 2 votes
AnswersGiven an input list of lists.. flatten the list. For e.g.
- techpanja in United States for yammer
{{1,2}, {3}, {4,5}} ... Output should be {1, 2, 3, 4, 5}| Report Duplicate | Flag | PURGE
Microsoft Software Engineer / Developer - 2of 2 votes
AnswersFind the max height of a binary tree.
- techpanja in United States for yammer| Report Duplicate | Flag | PURGE
Microsoft Software Engineer / Developer - 3of 3 votes
AnswersWrite your own regular expression parser for following condition:
- techpanja in United States for yammer
az*b can match any string that starts with and ends with b and 0 or more Z's between. for e.g. azb, azzzb etc.
a.b can match anything between a and b e.g. ajsdskjb etc.
Your function will have to parameters: Input String and Regex. Return true/false if the input string satisfies the regex condition. Note: The input string can contain multiple regex. For e.g. az*bc.g| Report Duplicate | Flag | PURGE
Microsoft Software Engineer / Developer - 14of 16 votes
AnswersDesign an architecture for REST APIs where you have to upload big data like images/videos etc. Request should be async. Follow up: How will you tune the performance if you have millions of requests coming at same time? Clues: Queueing the request, Storing data in filesystems rather than traditional DB etc.
- techpanja in United States| Report Duplicate | Flag | PURGE
Amazon Senior Software Development Engineer Distributed Computing - 2of 2 votes
AnswersOpen Ended: Design an email system
- techpanja in United States| Report Duplicate | Flag | PURGE
Apple Software Engineer / Developer Algorithm - 2of 4 votes
AnswersGiven two trees, find if tree 2 is the mirror image of tree 1.
- techpanja in United States| Report Duplicate | Flag | PURGE
Apple Software Engineer / Developer Data Structures - 4of 4 votes
AnswersFind the latest version of released software. For e.g1. 2 and 2.2.. latest is 2.2.
- techpanja in United States
eg2: 3.1 and 3.1.3... latest version is 3.1.3... version is passed as string in above format.| Report Duplicate | Flag | PURGE
Ebay Software Engineer / Developer Java - 2of 2 votes
AnswersDesign an architecture for REST APIs where you have to upload big data like images/videos etc. Request should be async. Follow up: How will you tune the performance if you have millions of requests coming at same time? Clues: Queueing the request, Storing data in filesystems rather than traditional DB etc.
- techpanja in United States| Report Duplicate | Flag | PURGE
Ebay Software Engineer / Developer Distributed Computing
github.com/techpanja/interviewproblems/blob/master/src/arrays/indexequaltonumbersortedarray/IndexEqualToNumberSortedArray.java
public class IndexEqualToNumberSortedArray {
private IndexEqualToNumberSortedArray() {
}
/*
* Binary search. O(log N) solution.
* */
public static int indexEqualToNumberSortedArray(int[] inputArray) {
if (inputArray.length == 0) {
return -1;
}
int low = 0;
int high = inputArray.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (inputArray[mid] == mid) {
return mid;
} else if (inputArray[mid] > mid) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(indexEqualToNumberSortedArray(new int[] {1, 2, 4, 5, 6, 7}));
System.out.println(indexEqualToNumberSortedArray(new int[] {0, 3, 4, 5, 6, 7}));
System.out.println(indexEqualToNumberSortedArray(new int[] {-1, 0, 1, 2, 4, 7}));
System.out.println(indexEqualToNumberSortedArray(new int[] {-1, 0, 1, 2, 3, 5}));
System.out.println(indexEqualToNumberSortedArray(new int[] {-1, 0, 1, 3, 5, 6}));
}
}
github.com/techpanja/interviewproblems/blob/master/src/arrays/searchrotatedsortedarray/SearchInRotatedSortedArray.java
public static boolean searchInRotatedSortedArray(int[] inputArray, int number) {
if (inputArray.length == 0) {
return false;
}
if (inputArray.length == 1) {
return inputArray[0] == number;
}
int low = 0, high = inputArray.length - 1;
return recursiveSearch(inputArray, low, high, number);
}
private static boolean recursiveSearch(int[] inputArray, int low, int high, int number) {
if (high < low) {
return false;
}
int mid = (low + high) / 2;
if (inputArray[low] == number
|| inputArray[mid] == number
|| inputArray[high] == number) {
return true;
}
if (inputArray[low] < inputArray[mid]
&& inputArray[low] < number
&& number <= inputArray[mid]) {
return recursiveSearch(inputArray, low, mid - 1, number);
} else if (inputArray[mid] < inputArray[high]
&& inputArray[mid] < number
&& number <= inputArray[high]) {
return recursiveSearch(inputArray, mid + 1, high, number);
} else if (inputArray[low] > inputArray[mid]) {
return recursiveSearch(inputArray, low, mid - 1, number);
} else if (inputArray[mid] > inputArray[high]) {
return recursiveSearch(inputArray, mid + 1, high, number);
} else {
return false;
}
}
Simplifying my previous code.
/*
* Assume words in inputBody are separated by space.
* */
public static int findDistanceBetweenWords(String inputBody, String pair1, String pair2) {
if (inputBody.isEmpty() || pair1.isEmpty() || pair2.isEmpty()) {
return -1;
}
if (pair1.equals(pair2)) {
return 0;
}
StringTokenizer stringTokenizer = new StringTokenizer(inputBody, " ");
int distance = 0, globalDistance = Integer.MAX_VALUE;
String token;
while (stringTokenizer.hasMoreTokens()) {
token = stringTokenizer.nextToken();
if (token.equals(pair1)) {
distance = 0;
} else if (token.equals(pair2)) {
globalDistance = Math.min(distance, globalDistance);
}
distance++;
}
if (globalDistance == Integer.MAX_VALUE || globalDistance == 0) {
return -1;
} else {
return globalDistance;
}
}
github.com/techpanja/interviewproblems/blob/master/src/strings/distancebetweenwords/DistanceBetweenWords.java
/* Kadane's Algo
* Assume words in inputBody are separated by space.
* */
public static int findDistanceBetweenWords(String inputBody, String pair1, String pair2) {
if (inputBody.isEmpty() || pair1.isEmpty() || pair2.isEmpty()) {
return -1;
}
if (pair1.equals(pair2)) {
return 0;
}
StringTokenizer stringTokenizer = new StringTokenizer(inputBody, " ");
int distance = 0, globalDistance = inputBody.length();
boolean foundPair1 = false;
String token = "";
while (stringTokenizer.hasMoreTokens()) {
token = stringTokenizer.nextToken();
if (token.equals(pair1)) {
distance = 0;
foundPair1 = true;
}
if (foundPair1) {
distance++;
}
if (token.equals(pair2) && foundPair1) {
globalDistance = Math.min(distance, globalDistance);
}
}
if (globalDistance == inputBody.length()) {
return -1;
} else {
return globalDistance - 1;
}
}
public static int productOfDigitsEqualToNumber(int inputNumber) {
if (0 <= inputNumber && inputNumber <= 9) {
return inputNumber;
}
if (inputNumber < 0) {
inputNumber = Math.abs(inputNumber);
}
int smallestNumber = 0;
int factor = 1;
while (inputNumber > 1) {
for (int i = 9; i > 1; i--) {
if (inputNumber % i == 0) {
inputNumber = inputNumber / i;
smallestNumber = smallestNumber + i * factor;
factor = factor * 10;
if (inputNumber == 1) {
return smallestNumber;
}
break;
} else if (i == 2) {
return -1;
}
}
}
return -1;
}
- techpanja January 27, 2014This should work too?
if (inputString.isEmpty() || sequenceLength <= 0 || sequenceLength >= inputString.length()) {
System.out.println("Invalid input");
} else {
int i = 0;
int j = i + sequenceLength;
Set<String> tempSet = new HashSet<>();
Set<String> repeatingSequences = new TreeSet<>();
while (j <= inputString.length()) {
if (!tempSet.add(inputString.substring(i, j))) {
repeatingSequences.add(inputString.substring(i, j));
}
i++;
j = i + sequenceLength;
}
for (String str : repeatingSequences) {
System.out.println(str);
}
}
Are we assuming that login and logout times dont span across days?
In that case we can maintain an array of size 24 intialized with counter value '0' for 24hours in a day. Depending on the login and logout time, we can increase the counter for the range.
For e.g. the 1st user has login time = 1 and logout time = 4
Then we would increament the value in a[1], a[2], a[3] and a[4]
github.com/techpanja/interviewproblems/tree/master/src/arrays/maxsubarray
/**
* the task of finding the contiguous subarray which has the largest sum.
*
* Algo:----
*
* 1. Maintain two variables: maxSoFar and maxEndingAtCurrentPosition in Array.
* 2. Update maxEndingAtCurrentPosition if (maxEndingAtCurrentPosition + current[i]) > than 0.
* 3. Keep on updating maxSoFar whenever maxEndingAtCurrentPosition is greater than maxSoFar.
*
* en.wikipedia.org/wiki/Kadane%27s_Algorithm
* Date: 11/4/13
* Time: 3:23 PM
*/
public class FindMaxSubArray {
private FindMaxSubArray() {
}
public static int findMaxOfSubArrayUsingMathMax(int[] inputArray) {
int maxSoFar = 0;
int maxEndingHere = 0;
for (int i : inputArray) {
maxEndingHere = Math.max(0, maxEndingHere + i);
maxSoFar = Math.max(maxSoFar, maxEndingHere);
}
return maxSoFar;
}
public static String findMaxSubArrayUsingFor(int[] inputArray) {
int maxSoFar = 0;
int maxEndingHere = 0;
int maxStartIndex = 0;
int maxEndIndex = 0;
for (int i = 0; i < inputArray.length; i++) {
System.out.println("ending here " + maxEndingHere);
System.out.println("so far " + maxSoFar);
if (maxEndingHere + inputArray[i] > 0) {
maxEndingHere = maxEndingHere + inputArray[i];
} else {
maxEndingHere = 0;
maxStartIndex = i + 1;
}
if (maxEndingHere > maxSoFar) {
maxSoFar = maxEndingHere;
maxEndIndex = i;
}
}
int[] maxArray = new int[0];
if (maxStartIndex <= maxEndIndex) {
maxArray = Arrays.copyOfRange(inputArray, maxStartIndex, maxEndIndex + 1);
}
return String.valueOf("\nInput-Array:" + Arrays.toString(inputArray)
+ "\nMax: " + maxSoFar
+ "\nSub-Array:" + Arrays.toString(maxArray));
}
}
Its only for Java Implementation. However, its very easy to implement it using linkedlist.
/**
* Least Recently Used Cache Implementation.
* Date: 9/19/13
* Time: 8:20 PM
*/
public class LRUCache extends LinkedHashMap {
private int maxSize;
public LRUCache(int maxSize) {
super(maxSize, 0.75F, true);
this.maxSize = maxSize;
}
public boolean removeEldestEntry(Map.Entry map) {
return super.size() > maxSize;
}
}
public class FindMissingNumber {
private FindMissingNumber() {
}
// does not work for zero.
public static int findMissingNumber(int[] inputArray) {
int xor1 = 1;
int xor2 = inputArray[0];
int length = inputArray.length;
for (int i = 2; i <= length + 1; i++) {
xor1 = xor1 ^ i;
}
for (int i = 1; i < length; i++) {
xor2 = xor2 ^ inputArray[i];
}
return xor1 ^ xor2;
}
// does not work for zero.
public static int findMissingNumberUsingFormula(int[] inputArray) {
int sum = 0;
for (int i : inputArray) {
sum = i + sum;
}
// actual size of array is length + 1 since one number is missing.
int length = inputArray.length + 1;
int factor = length * (length + 1) / 2;
return factor - sum;
}
}
public class CartesianOfLists {
public static List<List> getCartesianOfLists(List<List> inputListOfLists) {
List<List> permutations = new ArrayList<List>();
for (List list : inputListOfLists) {
permutations = generatePermutations(permutations, list);
}
return permutations;
}
private static List<List> generatePermutations(List<List> permutations, List<String> list) {
List<List> newPermutations = new ArrayList<List>();
for (String str : list) {
if (permutations.isEmpty()) {
List tempList = new ArrayList();
tempList.add(str);
newPermutations.add(tempList);
} else {
for (List tempList : permutations) {
List innerList = new ArrayList();
innerList.addAll(tempList);
if (!innerList.contains(str)) {
innerList.add(str);
newPermutations.add(innerList);
}
}
}
}
return newPermutations;
}
}
public class PrintNaryTreeWithLevels {
private static Queue<Vertex> queue = new LinkedList<Vertex>();
public static void bfs(Graph graph) {
Vertex vertex = graph.getVertexesAsArray()[0];
vertex.setVisited(true);
int counter = 0;
System.out.println(vertex + "level " + counter);
counter++;
queue.add(vertex);
//null acts as a pointer/marker when new level should begin.
queue.add(null);
while (!queue.isEmpty()) {
Vertex currentVertex = queue.remove();
if (currentVertex == null) {
counter++;
if (queue.isEmpty()) {
break;
}
currentVertex = queue.remove();
queue.add(null);
}
Vertex unvisitedVertex;
while ((unvisitedVertex = getUnvisitedVertex(currentVertex)) != null) {
unvisitedVertex.setVisited(true);
queue.add(unvisitedVertex);
System.out.println(unvisitedVertex + "level " + counter);
}
}
}
public static Vertex getUnvisitedVertex(Vertex vertex) {
for (Vertex temp : vertex.getDependsOn()) {
if (!temp.isVisited()) {
return temp;
}
}
return null;
}
public static void main(String[] args) {
Graph graph = new UnDirectedGraph(11);
graph.addEdge("V1", "V2");
graph.addEdge("V1", "V3");
graph.addEdge("V1", "V6");
graph.addEdge("V2", "V4");
graph.addEdge("V3", "V5");
graph.addEdge("V3", "V10");
graph.addEdge("V4", "V7");
graph.addEdge("V4", "V8");
graph.addEdge("V6", "V9");
graph.addEdge("V9", "V11");
graph.displayVertexList();
graph.displayGraphDependency();
bfs(graph);
}
}
public static char findFirstNonRepeatedChar(String inputString) {
Map<Character, Integer> charMapCountOne= new LinkedHashMap<Character, Integer>();
Set<Character> repeatedCharSet = new HashSet<Character>();
for (char c : inputString.toCharArray()) {
if (charMapCountOne.get(c) == null && !repeatedCharSet.contains(c)) {
charMapCountOne.put(c, 1);
} else {
repeatedCharSet.add(c);
charMapCountOne.remove(c);
}
}
if (charMapCountOne.isEmpty()) {
return " ".charAt(0);
}
return charMapCountOne.keySet().iterator().next();
}
public static void circularShiftToRightInPlace(int[] inputArray, int shiftSize) {
int length = inputArray.length;
if (inputArray.length <= 1) {
System.out.println("Array must have more than one integer.");
} else {
System.out.println("Before shift:--");
for (int temp : inputArray) {
System.out.println(temp);
}
int start = 0;
int end = length - (shiftSize % length) - 1;
circularShiftToRightInPlace(inputArray, start, end);
circularShiftToRightInPlace(inputArray, end + 1, inputArray.length - 1);
circularShiftToRightInPlace(inputArray, 0, inputArray.length - 1);
System.out.println("After shift:--");
for (int temp : inputArray) {
System.out.println(temp);
}
}
}
private static void circularShiftToRightInPlace(int[] inputArray, int start, int end) {
int i = start;
int j = end;
while (i < j) {
int temp = inputArray[i];
inputArray[i] = inputArray[j];
inputArray[j] = temp;
i++;
j--;
}
}
// IN-PLACE
Have tested for following inputs:---
int[] ints = new int[] {6, 7, 8, 1, 2, 3, 9, 10};
int[] ints = new int[] {4, 7, 9, 8, 2};
int[] ints = new int[] {1, 11, 12, 7, 8, 9};
int[] ints = new int[] {1, 4, 2, 3};
int[] ints = new int[]{1, 11, 8, 9, 10, 14};
int[] ints = new int[]{10, 6, 11};
int[] ints = new int[]{1, 5, 10, 8, 9};
public static int[] findSubsequenceWithMaxProduct(int[] inputArray) {
int maxProduct = 0;
int[] subsequenceWithLargestProduct = new int[3];
for (int i = 1; i < inputArray.length - 1; i++) {
int leftLowest = 0;
int rightHighest = 0;
// find lowest on the left.
for (int j = 0; j < i; j++) {
if (inputArray[j] < inputArray[i] && inputArray[j] > leftLowest) {
leftLowest = inputArray[j];
}
}
// find highest on right.
for (int k = i + 1; k < inputArray.length; k++) {
if (inputArray[k] > inputArray[i] && inputArray[k] > rightHighest) {
rightHighest = inputArray[k];
}
}
int currentProduct = inputArray[i] * leftLowest * rightHighest;
if (currentProduct > maxProduct) {
maxProduct = currentProduct;
subsequenceWithLargestProduct = new int[]{leftLowest, inputArray[i], rightHighest};
}
}
return subsequenceWithLargestProduct;
}
Failure to override one of them while overriding other will result in inconsistent working of hash-based collections..
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj == null || obj.getClass() != this.getClass()) {
return false;
}
Person guest = (Person) obj;
return id == guest.id;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result + id;
result = prime * result
+ ((lastName == null) ? 0 : lastName.hashCode());
return result;
}
public static void circularShift(int[] inputArray, int shiftSize) {
if (inputArray.length <= 1) {
System.out.println("Array must have more than one integer.");
} else {
System.out.println("Before shift:--");
for (int temp : inputArray) {
System.out.println(temp);
}
int i = 0;
int[] outputArray = new int[inputArray.length];
while (i < inputArray.length) {
int k = (shiftSize + i) % inputArray.length;
outputArray[k] = inputArray[i];
i++;
}
System.out.println("After shift:--");
for (int temp : outputArray) {
System.out.println(temp);
}
}
}
}
public static String longestSubstringUnrepeatedChar(String inputString) {
String longestSoFar = "";
String longestSubstringResult = "";
if (inputString.isEmpty()) {
return "";
}
if (inputString.length() == 1) {
return inputString;
}
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (int i = 0; i < inputString.length(); i++) {
char currentCharacter = inputString.charAt(i);
if (longestSoFar.indexOf(currentCharacter) == -1) {
if (!map.containsKey(currentCharacter)) {
map.put(currentCharacter, i);
}
longestSoFar = longestSoFar + currentCharacter;
} else {
longestSoFar = inputString.substring(map.get(currentCharacter) + 1, i + 1);
map.put(currentCharacter, i);
}
if (longestSoFar.length() > longestSubstringResult.length()) {
longestSubstringResult = longestSoFar;
}
}
return longestSubstringResult;
}
public static boolean isIsomorphic(String inputString1, String inputString2) {
int length1 = inputString1.length();
int length2 = inputString2.length();
if (length1 != length2) {
return false;
}
if (length1 == 1) {
return true;
}
Map<Character, Character> characterMap = new HashMap<Character, Character>();
for (int i = 0; i < length1; i++) {
if (!characterMap.containsKey(inputString1.charAt(i)) && !characterMap.containsValue(inputString2.charAt(i))) {
characterMap.put(inputString1.charAt(i), inputString2.charAt(i));
}
if (characterMap.get(inputString1.charAt(i)) == null) {
return false;
}
if (!characterMap.get(inputString1.charAt(i)).equals(inputString2.charAt(i))) {
return false;
}
}
return true;
}
// fixed a bug
- techpanja November 08, 2013MAX HEAP:---
public class Node {
private int data;
public Node(int data) {
this.data = data;
}
}
/*
* Insert @end of heapArray and trickle up until its greater than its parent.
* */
@Override
public boolean insert(int key) {
if (currentSize == maxSize) {
return false;
}
Node node = new Node(key);
heapArray[currentSize] = node;
trickleUp(currentSize);
currentSize = currentSize + 1;
return true;
}
private void trickleUp(int index) {
int parentIndex = (index - 1) / 2;
Node bottom = heapArray[index];
while (index > 0 && bottom.getData() > heapArray[parentIndex].getData()) {
// move smaller parent downwards.
heapArray[index] = heapArray[parentIndex];
index = parentIndex;
parentIndex = (parentIndex - 1) / 2;
}
heapArray[index] = bottom;
}
/// Top 10 elements of heapArray is the result. You can modify the Node to hold Item as well as the value
public static boolean isIsomorphic(String inputString1, String inputString2) {
int length1 = inputString1.length();
int length2 = inputString2.length();
if (length1 != length2) {
return false;
}
if (length1 == 1) {
return true;
}
Map<Character, Character> characterMap = new HashMap<Character, Character>();
for (int i = 0; i < length1; i++) {
if (!characterMap.containsKey(inputString1.charAt(i))) {
characterMap.put(inputString1.charAt(i), inputString2.charAt(i));
}
if (!characterMap.get(inputString1.charAt(i)).equals(inputString2.charAt(i))) {
return false;
}
}
return true;
}
github.com/techpanja/interviewproblems/blob/master/src/numberproblems/productofdigitsequaltonumber/ProductOfDigitsEqualToNumber.java
- techpanja February 05, 2014