Palindrome

ATM machines allow 4 or 6 digit PIN codes and PIN codes cannot contain anything but exactly 4 digits or exactly 6 digits.

String.Match()

ATM machines allow 4 or 6 digit PIN codes and PIN codes cannot contain anything but exactly 4 digits or exactly 6 digits.

If the function is passed a valid PIN string, return true, else return false.

two important cases

  • no letters
  • length limited

key: how to limit string in certain format

  1. ASII code to range numbers, use String.length to limit digits length

==be aware of ture and false== we can simply coding

 // 1416ms  
    public static boolean validatePin(String pin) {  
        // Your code here...  
        int l = pin.length();  
//        boolean o = (l == 4) || (l == 6) ? true : false;  
              // boolean o = (l==4) || (l==6);  
//        for reach can't apply to string  
        for(char c : pin.toCharArray()) {  
            if(c<48 || c>57){  
                o = false;  
            }        }        return o;  
    }
  1. use built-in regex Patterns String.match()
 public static boolean validatePin(String pin) {
    return pin.matches("\\d{4}|\\d{6}");
  }

\d means 0-9, but java can not use \d so replace with \\d match 4 or 6 digits use \\d{4} but remember no space before or after like \\d{4} or \\d{4}

  1. pre-compile to improve performance

we need compile patterns every time which is time-consuming with pre-compile we can save performance

static Pattern pattern = Pattern.compile("\\d{4}|\\d{6}");

public static boolean validatePin(String pin) {  
    // pre compile improve performance  
    return pattern.matcher(pin).matches();  
}

test-case

@Test  
public void validPins() {  
    assertEquals(true, Solution.validatePin("1234"));  
    assertEquals(true, Solution.validatePin("0000"));  
    assertEquals(true, Solution.validatePin("1111"));  
    assertEquals(true, Solution.validatePin("123456"));  
    assertEquals(true, Solution.validatePin("098765"));  
    assertEquals(true, Solution.validatePin("000000"));  
    assertEquals(true, Solution.validatePin("090909"));  
}  
  
@Test  
public void nonDigitCharacters() {  
    assertEquals(false, Solution.validatePin(" a234"));  
    assertEquals(false, Solution.validatePin(".234"));  
    assertEquals(false, Solution.validatePin("utp4564utp"));  
    assertEquals(false, Solution.validatePin("newline"));  
}  
  
@Test  
public void invalidLengths() {  
    assertEquals(false, Solution.validatePin("1"));  
    assertEquals(false, Solution.validatePin("12"));  
    assertEquals(false, Solution.validatePin("123"));  
    assertEquals(false, Solution.validatePin("12345"));  
    assertEquals(false, Solution.validatePin("1234567"));  
    assertEquals(false, Solution.validatePin(" 1234"));  
    assertEquals(false, Solution.validatePin(" 1234 "));  
    assertEquals(false, Solution.validatePin("1234 "));  
    assertEquals(false, Solution.validatePin("1.234"));  
    assertEquals(false, Solution.validatePin("00000000"));  
    assertEquals(false, Solution.validatePin("00000"));  
    assertEquals(false, Solution.validatePin("00000a"));  
}
Last modified April 7, 2025: update codewar (7e82e67)