How can I print out all possible letter combinations a given phone number can represent?

前端 未结 30 2075
逝去的感伤
逝去的感伤 2020-12-22 18:01

I just tried for my first programming interview and one of the questions was to write a program that given a 7 digit telephone number, could print all possible combinations

相关标签:
30条回答
  • 2020-12-22 18:39

    Scala solution:

    def mnemonics(phoneNum: String, dict: IndexedSeq[String]): Iterable[String] = {
      def mnemonics(d: Int, prefix: String): Seq[String] = {
        if (d >= phoneNum.length) {
          Seq(prefix)
        } else {
          for {
            ch <- dict(phoneNum.charAt(d).asDigit)
            num <- mnemonics(d + 1, s"$prefix$ch")
          } yield num
        }
      }
    
      mnemonics(0, "")
    }
    

    Assuming each digit maps to at most 4 characters, the number of recursive calls T satisfy the inequality T(n) <= 4T(n-1), which is of the order 4^n.

    0 讨论(0)
  • 2020-12-22 18:40

    It is similar to a question called letter combinations of a phone number, here is my solution.
    It works for an arbitrary number of digits, so long as the result doesn't exceed the memory limit.

    import java.util.HashMap;
    public class Solution {
        public ArrayList<String> letterCombinations(String digits) {
            ArrayList<String> res = new ArrayList<String>();
            ArrayList<String> preres = new ArrayList<String>();
            res.add("");
    
            for(int i = 0; i < digits.length(); i++) {
                String letters = map.get(digits.charAt(i));
                if (letters.length() == 0)
                    continue;
                for(String str : res) {
                    for(int j = 0; j < letters.length(); j++)
                        preres.add(str + letters.charAt(j));
                }
                res = preres;
                preres = new ArrayList<String>();
            }      
            return res;
        }
    
        static final HashMap<Character,String> map = new HashMap<Character,String>(){{
            put('1', "");
            put('2',"abc");
            put('3',"def");
            put('4',"ghi");
            put('5',"jkl");
            put('6',"mno");
            put('7',"pqrs");
            put('8',"tuv");
            put('9',"wxyz");
            put('0', "");
        }} ;
    }
    

    I'm not sure how 12-digit international numbers affect the design.

    Edit: International numbers will also be handled

    0 讨论(0)
  • 2020-12-22 18:40

    One option in Objective-C:

    - (NSArray *)lettersForNumber:(NSNumber *)number {
        switch ([number intValue]) {
            case 2:
                return @[@"A",@"B",@"C"];
            case 3:
                return @[@"D",@"E",@"F"];
            case 4:
                return @[@"G",@"H",@"I"];
            case 5:
                return @[@"J",@"K",@"L"];
            case 6:
                return @[@"M",@"N",@"O"];
            case 7:
                return @[@"P",@"Q",@"R",@"S"];
            case 8:
                return @[@"T",@"U",@"V"];
            case 9:
                return @[@"W",@"X",@"Y",@"Z"];
            default:
                return nil;
        }
    }
    
    - (NSArray *)letterCombinationsForNumbers:(NSArray *)numbers {
        NSMutableArray *combinations = [[NSMutableArray alloc] initWithObjects:@"", nil];
    
        for (NSNumber *number in numbers) {
            NSArray *lettersNumber = [self lettersForNumber:number];
    
            //Ignore numbers that don't have associated letters
            if (lettersNumber.count == 0) {
                continue;
            }
    
            NSMutableArray *currentCombinations = [combinations mutableCopy];
            combinations = [[NSMutableArray alloc] init];
    
            for (NSString *letter in lettersNumber) {
    
                for (NSString *letterInResult in currentCombinations) {
    
                    NSString *newString = [NSString stringWithFormat:@"%@%@", letterInResult, letter];
                    [combinations addObject:newString];
                }
            }
        }
    
        return combinations;
    }
    

    0 讨论(0)
  • 2020-12-22 18:43
    namespace WordsFromPhoneNumber
    {
        /// <summary>
        /// Summary description for WordsFromPhoneNumber
        /// </summary>
        [TestClass]
        public class WordsFromPhoneNumber
        {
            private static string[] Chars = { "0", "1", "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ" };
            public WordsFromPhoneNumber()
            {
                //
                // TODO: Add constructor logic here
                //
            }
    
            #region overhead
    
            private TestContext testContextInstance;
    
            /// <summary>
            ///Gets or sets the test context which provides
            ///information about and functionality for the current test run.
            ///</summary>
            public TestContext TestContext
            {
                get
                {
                    return testContextInstance;
                }
                set
                {
                    testContextInstance = value;
                }
            }
    
            #region Additional test attributes
            //
            // You can use the following additional attributes as you write your tests:
            //
            // Use ClassInitialize to run code before running the first test in the class
            // [ClassInitialize()]
            // public static void MyClassInitialize(TestContext testContext) { }
            //
            // Use ClassCleanup to run code after all tests in a class have run
            // [ClassCleanup()]
            // public static void MyClassCleanup() { }
            //
            // Use TestInitialize to run code before running each test 
            // [TestInitialize()]
            // public void MyTestInitialize() { }
            //
            // Use TestCleanup to run code after each test has run
            // [TestCleanup()]
            // public void MyTestCleanup() { }
            //
            #endregion
    
            [TestMethod]
            public void TestMethod1()
            {
                IList<string> words = Words(new int[] { 2 });
                Assert.IsNotNull(words, "null");
                Assert.IsTrue(words.Count == 3, "count");
                Assert.IsTrue(words[0] == "A", "a");
                Assert.IsTrue(words[1] == "B", "b");
                Assert.IsTrue(words[2] == "C", "c");
            }
    
            [TestMethod]
            public void TestMethod23()
            {
                IList<string> words = Words(new int[] { 2 , 3});
                Assert.IsNotNull(words, "null");
                Assert.AreEqual(words.Count , 9, "count");
                Assert.AreEqual(words[0] , "AD", "AD");
                Assert.AreEqual(words[1] , "AE", "AE");
                Assert.AreEqual(words[2] , "AF", "AF");
                Assert.AreEqual(words[3] , "BD", "BD");
                Assert.AreEqual(words[4] , "BE", "BE");
                Assert.AreEqual(words[5] , "BF", "BF");
                Assert.AreEqual(words[6] , "CD", "CD");
                Assert.AreEqual(words[7] , "CE", "CE");
                Assert.AreEqual(words[8] , "CF", "CF");
            }
    
            [TestMethod]
            public void TestAll()
            {
                int[] number = new int [4];
                Generate(number, 0);
            }
    
            private void Generate(int[] number, int index)
            {
                for (int x = 0; x <= 9; x += 3)
                {
                    number[index] = x;
                    if (index == number.Length - 1)
                    {
                        var w = Words(number);
                        Assert.IsNotNull(w);
                        foreach (var xx in number)
                        {
                            Console.Write(xx.ToString());
                        }
                        Console.WriteLine(" possible words:\n");
                        foreach (var ww in w)
                        {
                            Console.Write("{0} ", ww);
                        }
                        Console.WriteLine("\n\n\n");
                    }
                    else
                    {
                        Generate(number, index + 1);
                    }
                }
            }
    
            #endregion
    
            private IList<string> Words(int[] number)
            {
                List<string> words = new List<string>(100);
                Assert.IsNotNull(number, "null");
                Assert.IsTrue(number.Length > 0, "length");
                StringBuilder word = new StringBuilder(number.Length);
                AddWords(number, 0, word, words);
    
                return words;
            }
    
            private void AddWords(int[] number, int index, StringBuilder word, List<string> words)
            {
                Assert.IsTrue(index < number.Length, "index < length");
                Assert.IsTrue(number[index] >= 0, "number >= 0");
                Assert.IsTrue(number[index] <= 9, "number <= 9");
    
                foreach (var c in Chars[number[index]].ToCharArray())
                {
                    word.Append(c);
                    if (index < number.Length - 1)
                    {
                        AddWords(number, index + 1, word, words);
                    }
                    else
                    {
                        words.Add(word.ToString());
                    }
                    word.Length = word.Length - 1;
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-22 18:44

    In JavaScript. A CustomCounter class takes care of incrementing indexes. Then just output the different possible combinations.

    var CustomCounter = function(min, max) {
        this.min = min.slice(0)
        this.max = max.slice(0)
        this.curr = this.min.slice(0)
        this.length = this.min.length
    }
    
    CustomCounter.prototype.increment = function() {
        for (var i = this.length - 1, ii = 0; i >= ii; i--) {
            this.curr[i] += 1
            if (this.curr[i] > this.max[i]) {
                this.curr[i] = 0
            } else {
                break
            }
        }
    }
    
    CustomCounter.prototype.is_max = function() {
        for (var i = 0, ii = this.length; i < ii; ++i) {
            if (this.curr[i] !== this.max[i]) {
                return false
            }
        }
        return true
    }
    
    var PhoneNumber = function(phone_number) {
        this.phone_number = phone_number
        this.combinations = []
    }
    
    PhoneNumber.number_to_combinations = {
        1: ['1']
      , 2: ['2', 'a', 'b', 'c']
      , 3: ['3', 'd', 'e', 'f']
      , 4: ['4', 'g', 'h', 'i']
      , 5: ['5', 'j', 'k', 'l']
      , 6: ['6', 'm', 'n', 'o']
      , 7: ['7', 'p', 'q', 'r', 's']
      , 8: ['8', 't', 'u', 'v']
      , 9: ['9', 'w', 'x', 'y', 'z']
      , 0: ['0', '+']
    }
    
    PhoneNumber.prototype.get_combination_by_digit = function(digit) {
        return PhoneNumber.number_to_combinations[digit]
    }
    
    PhoneNumber.prototype.add_combination_by_indexes = function(indexes) {
        var combination = ''
        for (var i = 0, ii = indexes.length; i < ii; ++i) {
            var phone_number_digit = this.phone_number[i]
            combination += this.get_combination_by_digit(phone_number_digit)[indexes[i]]
        }
    
        this.combinations.push(combination)
    }
    
    PhoneNumber.prototype.update_combinations = function() {
        var min_indexes = []
          , max_indexes = []
    
        for (var i = 0, ii = this.phone_number.length; i < ii; ++i) {
            var digit = this.phone_number[i]
            min_indexes.push(0)
            max_indexes.push(this.get_combination_by_digit(digit).length - 1)
        }
    
        var c = new CustomCounter(min_indexes, max_indexes)
    
        while(true) {
            this.add_combination_by_indexes(c.curr)
            c.increment()
    
            if (c.is_max()) {
                this.add_combination_by_indexes(c.curr)
                break
            }
        }
    }
    
    var phone_number = new PhoneNumber('120')
    phone_number.update_combinations()
    console.log(phone_number.combinations)
    
    0 讨论(0)
  • 2020-12-22 18:45
    public class Permutation {
    
        //display all combination attached to a 3 digit number
    
        public static void main(String ar[]){
    
                char data[][]= new char[][]{{'a','k','u'},
                                    {'b','l','v'},
                                    {'c','m','w'},
                                    {'d','n','x'},
                                    {'e','o','y'},
                                    {'f','p','z'},
                                    {'g','q','0'},
                                    {'h','r','0'},
                                    {'i','s','0'},
                                    {'j','t','0'}};
    
    
            int num1, num2, num3=0;
            char tempdata[][]= new char[3][3];
            StringBuilder number = new StringBuilder("324"); // a 3 digit number
    
            //copy data to a tempdata array-------------------
            num1= Integer.parseInt(number.substring(0,1));
            tempdata[0] = data[num1];
            num2= Integer.parseInt(number.substring(1,2));
            tempdata[1] = data[num2];
            num3= Integer.parseInt(number.substring(2,3));
            tempdata[2] = data[num3];
    
            //display all combinations--------------------
            char temp2[][]=tempdata;
            char tempd, tempd2;
            int i,i2, i3=0;
            for(i=0;i<3;i++){
                    tempd = temp2[0][i];
                 for (i2=0;i2<3;i2++){
                     tempd2 = temp2[1][i2];
                     for(i3=0;i3<3;i3++){
                         System.out.print(tempd);
                         System.out.print(tempd2);
                         System.out.print(temp2[2][i3]);
                         System.out.println();
                     }//for i3
    
                }//for i2
             }
        }
    
    }//end of class
    
    0 讨论(0)
提交回复
热议问题