Question

Formatted question description: https://leetcode.ca/all/1694.html

 1694. Reformat Phone Number


 You are given a phone number as a string number. number consists of digits, spaces ' ', and/or dashes '-'.

 You would like to reformat the phone number in a certain manner.
    Firstly, remove all spaces and dashes.
    Then, group the digits from left to right into blocks of length 3 until there are 4 or fewer digits.
    The final digits are then grouped as follows:
         2 digits: A single block of length 2.
         3 digits: A single block of length 3.
         4 digits: Two blocks of length 2 each.
 The blocks are then joined by dashes. Notice that the reformatting process should never produce any blocks of length 1 and produce at most two blocks of length 2.

 Return the phone number after formatting.


 Example 1:

 Input: number = "1-23-45 6"
 Output: "123-456"
 Explanation: The digits are "123456".
 Step 1: There are more than 4 digits, so group the next 3 digits. The 1st block is "123".
 Step 2: There are 3 digits remaining, so put them in a single block of length 3. The 2nd block is "456".
 Joining the blocks gives "123-456".


 Example 2:

 Input: number = "123 4-567"
 Output: "123-45-67"
 Explanation: The digits are "1234567".
 Step 1: There are more than 4 digits, so group the next 3 digits. The 1st block is "123".
 Step 2: There are 4 digits left, so split them into two blocks of length 2. The blocks are "45" and "67".
 Joining the blocks gives "123-45-67".


 Example 3:

 Input: number = "123 4-5678"
 Output: "123-456-78"
 Explanation: The digits are "12345678".
 Step 1: The 1st block is "123".
 Step 2: The 2nd block is "456".
 Step 3: There are 2 digits left, so put them in a single block of length 2. The 3rd block is "78".
 Joining the blocks gives "123-456-78".
 Example 4:

 Input: number = "12"
 Output: "12"
 Example 5:

 Input: number = "--17-5 229 35-39475 "
 Output: "175-229-353-94-75"


 Constraints:

 2 <= number.length <= 100
 number consists of digits and the characters '-' and ' '.
 There are at least two digits in number.

Algorithm

The idea is to first take out all the numbers in it, and then follow every 3 with a’-‘. Take a final look, if the last character happens to be’-‘, remove it; if the penultimate character is’-‘, then swap the penultimate and third characters

Code

Java

public class Reformat_Phone_Number {

    public static void main(String[] args) {
        Reformat_Phone_Number out = new Reformat_Phone_Number();
        Solution s = out.new Solution();

        System.out.println(s.reformatNumber("1-23-45 6"));
    }

    class Solution {
        public String reformatNumber(String number) {

            if (number.length() <= 2) {
                return number;
            }

            number = number.replace("-", "");
            number = number.replace(" ", "");

            StringBuilder sb = new StringBuilder();

            while (0 < number.length()) {
                if (number.length() == 2) {
                    sb.append(number.substring(0,2)).append("-");
                    break;
                }

                if (number.length() == 4) {
                    sb.append(number.substring(0,2))
                        .append("-")
                        .append(number.substring(2,4))
                        .append("-");
                    break;

                }

                // rest are 3-digit group
                sb.append(number.substring(0,3)).append("-");

                number = number.substring(3);
            }

            return sb.delete(sb.length() - 1, sb.length()).toString();
        }
    }
}

Java

class Solution {
    public String reformatNumber(String number) {
        StringBuffer digits = new StringBuffer();
        int length = number.length();
        for (int i = 0; i < length; i++) {
            char c = number.charAt(i);
            if (Character.isDigit(c))
                digits.append(c);
        }
        int digitsCount = digits.length();
        if (digitsCount <= 3)
            return digits.toString();
        if (digitsCount == 4)
            return digits.substring(0, 2) + "-" + digits.substring(2);
        int remainder = digitsCount % 3;
        if (remainder == 1)
            remainder += 3;
        int firstPartLength = digitsCount - remainder;
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < firstPartLength; i += 3) {
            if (i > 0)
                sb.append('-');
            sb.append(digits.charAt(i));
            sb.append(digits.charAt(i + 1));
            sb.append(digits.charAt(i + 2));
        }
        if (remainder > 0) {
            sb.append('-');
            if (remainder == 4) {
                sb.append(digits.substring(firstPartLength, firstPartLength + 2));
                sb.append('-');
                sb.append(digits.substring(firstPartLength + 2));
            } else
                sb.append(digits.substring(firstPartLength));
        }
        return sb.toString();
    }
}

All Problems

All Solutions