exercism————Luhn

it2023-03-16  78

题目:

解法一:

boolean isVlaid(String s) { String number = s.replaceAll(" ",""); // check the argument if (number.length() <= 1 || number.matches("[^0-9]")) {throw new IllegalArgumentException("Invalid Argument");} // Converse char to int char[] set = number.toCharArray(); int[] num = new int[set.length]; for (int i = 0; i < set.length; i++) { num[i] = Character.getNumericValue(set[i]); } // calculate double of every two digit for (int i = set.length - 2; i >= 0; i -= 2) { if (2 * num[i] > 9) {num[i] = 2 * num[i] - 9;} else {num[i] = 2 * num[i];} } // add all the digits int sum = 0; for (int i = 0; i < num.length; i++) { sum += num[i]; } return sum % 10 == 0; }

解法二:

boolean isValid(String candidate) { int[] digits = new StringBuilder(candidate) .reverse() .toString() .replace(" ", "") .chars() .map(Character::getNumericValue) .toArray(); if (digits.length < 2){ return false; } if (Arrays.stream(digits).anyMatch(LuhnValidator::isInvalid)){ return false; } int sum = IntStream.range(0, digits.length) .map(i -> calculateDigitValue(digits[i], i)) .sum(); return sum % 10 == 0; } private static boolean isInvalid(Integer digit){ return digit < 0 || digit > 9; } private static Integer calculateDigitValue(Integer digit, Integer index){ if (index % 2 == 0){ return digit; } int digitDoubled = digit << 1; if (digitDoubled >= 10){ return digitDoubled - 9; } return digitDoubled; }

解法三:

public boolean isValid(String str) { String s = str.replaceAll(" ", ""); String[] nums = s.split(""); return s.matches("^\\d{2,}") && getSum(nums) % 10 == 0; } private int getSum(String[] nums) { // 如果nums.length为偶数,则从下标0开始,如果nums.length为奇数,则从下标1开始 int startDigit = (nums.length & 1) == 0 ? 0 : 1; // 如果为偶数位,则加倍偶数下标;如果位奇数,则加倍奇数下标 return IntStream.range(0, nums.length) .map(i -> (i & 1) == startDigit ? doubleDigit(Integer.parseInt(nums[i])) : Integer.parseInt(nums[i])) .sum(); } private int doubleDigit(int x) { if (x * 2 > 9) {return x * 2 - 9;}; return x * 2; }

总结:

解法一:中规中矩,正常思路解法二:条理清晰,可读性较强解法三:解法惊奇,找到偶数和奇数长度时,加倍下标也是偶数和奇数,所以只要加倍对应的下标数就ok了,妙!
最新回复(0)