Palindrome
ATM machines allow 4 or 6 digit PIN codes and PIN codes cannot contain anything but exactly 4 digits or exactly 6 digits.
Categories:
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
- 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;
}
- 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}
- 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"));
}