Thursday, August 4, 2011

Find all Concatenate Numbers - Unsorted



Question:
Given a list of positive numbers, you can concatenate them into one number in any order, how to print all unique possible numbers? In this question, the order of the result is not important.
For example, for input 1, 2, 3, the output would be a list of 6 integers: 123, 132, 213, 231, 312, 321.
Answer:
This is a classical dynamic programming problems, we can divide the integer list to two parts, a0, and [a, .., an-1], so if we know the result of the sub list[a, .., an-1], we can compute result of the whole integer list.
Take example, for 1, 23, 45. First, we compute the sub-result of 23, 45, the result would be [[23, 45], [45, 23]], then for each member of the sub-result, we add 1 to all possible positions.
First we add 1 to all possible positions of [23, 45], we will get three integer list, [[1, 23, 45], [23, 1, 45], [23, 45, 1]], then we add 1 to add 1 to all possible positions of [45, 23], the result would be [1, 45, 23], [45, 1, 23], [45, 23, 1]. So the all possible concatenate numbers of 1, 23, 45 would be 12345, 23145, 23451, 14523, 45123, 45231.
Code:
The complete algorithm/test code and also many other algorithm problems and solutions are available from https://github.com/programmer-plus.
package org.codeexample.concatNumber;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import org.codeexample.common.OverflowException;
import org.codeexample.common.Utils;
public class AllConcatNumberUnsorted {
 /**
  * This method would concatenate each integer value of the list in any
  * order.
  * 
  * @param la,
  *            a list of positive integer numbers
  * @return all unique concatenate integer numbers from the list
  * @throws IllegalArgumentException,
  *             if the parameter list contains negative value.
  * @throws OverflowException,
  *             it one possible concatenate integer number is greater than
  *             Integer.MAX_VALUE
  */
 public static List<Integer> concatNumbersUnsored(
   List<Integer> la)
   throws IllegalArgumentException,
   OverflowException {
  HashSet<List<Integer>> permutations = concatNumbersUnSortedImpl(
    la, 0);
  List<Integer> results = new ArrayList<Integer>();
  for (List<Integer> intList : permutations) {
   int result = 0;
   for (int tmpInt : intList) {
    result = Utils.concat(result, tmpInt);
   }
   results.add(result);
  }
  return results;
 }
 private static HashSet<List<Integer>> concatNumbersUnSortedImpl(
   List<Integer> la, int level) {
  HashSet<List<Integer>> permutations = new LinkedHashSet<List<Integer>>();
  // base case
  if (level == la.size() - 1) {
   if (la.get(level) < 0)
    throw new IllegalArgumentException(
      "Invalid number: " + la.get(level));
   List<Integer> result = new LinkedList<Integer>();
   result.add(la.get(level));
   permutations
     .add(new LinkedList<Integer>(result));
   return permutations;
  }
  int head = la.get(level);
  if (head < 0)
   throw new IllegalArgumentException(
     "Invalid number: " + head);
  HashSet<List<Integer>> subPermutations = concatNumbersUnSortedImpl(
    la, ++level);
  for (List<Integer> tmpList : subPermutations) {
   // add head to all possible n+1 positions
   for (int i = 0; i <= tmpList.size(); i++) {
    List<Integer> tmp = new LinkedList<Integer>(
      tmpList);
    tmp.add(i, head);
    permutations.add(tmp);
   }
  }
  return permutations;
 }
}

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts