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

前端 未结 30 2311
逝去的感伤
逝去的感伤 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:56

    This version in C# is reasonably efficient, and it works for non-western digits (like "۱۲۳۴۵۶۷" for example).

    static void Main(string[] args)
    {
        string phoneNumber = null;
        if (1 <= args.Length)
            phoneNumber = args[0];
        if (string.IsNullOrEmpty(phoneNumber))
        {
            Console.WriteLine("No phone number supplied.");
            return;
        }
        else
        {
            Console.WriteLine("Alphabetic phone numbers for \"{0}\":", phoneNumber);
            foreach (string phoneNumberText in GetPhoneNumberCombos(phoneNumber))
                Console.Write("{0}\t", phoneNumberText);
        }
    }
    
    public static IEnumerable GetPhoneNumberCombos(string phoneNumber)
    {
        phoneNumber = RemoveNondigits(phoneNumber);
        if (string.IsNullOrEmpty(phoneNumber))
            return new List();
    
        char[] combo = new char[phoneNumber.Length];
        return GetRemainingPhoneNumberCombos(phoneNumber, combo, 0);
    }
    
    private static string RemoveNondigits(string phoneNumber)
    {
        if (phoneNumber == null)
            return null;
        StringBuilder sb = new StringBuilder();
        foreach (char nextChar in phoneNumber)
            if (char.IsDigit(nextChar))
                sb.Append(nextChar);
        return sb.ToString();
    }
    
    private static IEnumerable GetRemainingPhoneNumberCombos(string phoneNumber, char[] combo, int nextDigitIndex)
    {
        if (combo.Length - 1 == nextDigitIndex)
        {
            foreach (char nextLetter in phoneNumberAlphaMapping[(int)char.GetNumericValue(phoneNumber[nextDigitIndex])])
            {
                combo[nextDigitIndex] = nextLetter;
                yield return new string(combo);
            }
        }
        else
        {
            foreach (char nextLetter in phoneNumberAlphaMapping[(int)char.GetNumericValue(phoneNumber[nextDigitIndex])])
            {
                combo[nextDigitIndex] = nextLetter;
                foreach (string result in GetRemainingPhoneNumberCombos(phoneNumber, combo, nextDigitIndex + 1))
                    yield return result;
            }
        }
    
    }
    
    private static char[][] phoneNumberAlphaMapping = new char[][]
    {
        new char[] { '0' },
        new char[] { '1' },
        new char[] { 'a', 'b', 'c' },
        new char[] { 'd', 'e', 'f' },
        new char[] { 'g', 'h', 'i' },
        new char[] { 'j', 'k', 'l' },
        new char[] { 'm', 'n', 'o' },
        new char[] { 'p', 'q', 'r', 's' },
        new char[] { 't', 'u', 'v' },
        new char[] { 'w', 'x', 'y', 'z' }
    };
    

提交回复
热议问题