我正在研究验证问题,我需要提出一个验证解决方案。
用户应输入一个4位数的密码。适用于它的验证规则应该是。
现在,我到目前为止所做的是: 我尝试使用这个公式,这是在另一个解决方案中给出的,但它没有帮助。 将输入分解为int []并获得第一个&来自它的最后一项,然后应用验证。
A [length-1] - A [0] = A.length-1 这适用于连续数字,1234,9876,但是当我输入1324时它会中断,这是有效的。
然后,为了验证重复,我想使用一个集合,输入集合中的数字,然后检查集合的大小,如1111,2222。但是,它在1212情况下再次失败,这是一个有效的输入。
虽然,这可以通过在每个数字中加1或减1来检验,并检查它是否连续,但我正在寻找其他的东西。那个解决方案将是我最后的方法。
java中的解决方案赞赏。如果没有,那么简单的伪代码也没问题。 假设只能输入数字作为输入。
更新: 对不起,伙计们,我不把SO作为一种做功课的方式,但我认为这些信息已经足够了。无论如何,这是我到目前为止所管理的,
private boolean checkFirstOrderAscendingDescending(int[] array, int length) {
// to handle passwords like 1234, 9876
int arrayItemOne = array[0];
int arrayItemLast = array[length - 1];
if (Math.abs(arrayItemLast - arrayItemOne) == length - 1) {
return false;
} else {
return true;
}
}
private boolean checkDuplicates(int[] array, int length) {
// to handle passwords like 1112, 9998
int arrayItemOne = array[0];
int arrayItemTwo = array[1];
int arrayItemThree = array[2];
if (arrayItemOne == arrayItemTwo && arrayItemTwo == arrayItemThree) {
return false;
} else {
return true;
}
}
可以扩展check duplicates方法以检查数组的第1,第2和第3个索引中的重复项。在调用这些方法之前,将对数组进行null检查。此外,可以保证数组的长度始终为4,因此请求特定索引永远不会给出ArrayIndexOutOfBounds。
我希望现在提供的信息足够了。
答案 0 :(得分:1)
这是我的解决方案。请不要将SO视为绕过家庭作业的一种方式
private static final int MAXIMUM_DUPLICATES = 2;
private static final int MAXIMUM_SERIES = 2;
private static final int SERIES_DIRECTION_ASCENDING = 0x42;
private static final int SERIES_DIRECTION_DESCENDING = ~SERIES_DIRECTION_ASCENDING;
public static boolean isPasswordValid(String pwd) {
char lastChar = '\0';
int duplicateCount = 1;
int seriesCount = 1;
int seriesDirection = 0;
char[] chars = pwd.toCharArray();
for(char c : chars) {
//skip the first character
if(lastChar > 0) {
if(lastChar == c)
duplicateCount++;
else
duplicateCount = 1;
if(lastChar == c+1) {
//was the previous char of the same series? if not then reset the seriesCount
if(seriesDirection != SERIES_DIRECTION_ASCENDING) {
seriesCount = 1;
seriesDirection = SERIES_DIRECTION_ASCENDING;
}
seriesCount++;
} else if(lastChar == c-1) {
if(seriesDirection != SERIES_DIRECTION_DESCENDING) {
seriesCount = 1;
seriesDirection = SERIES_DIRECTION_DESCENDING;
}
seriesCount++;
} else {
seriesCount = 1;
}
//are there more duplicates then are allowed?
if(duplicateCount > MAXIMUM_DUPLICATES)
return false;
//is there a longer series then allowed?
if(seriesCount > MAXIMUM_SERIES)
return false;
}
//save the last character
lastChar = c;
}
return true;
}
在这里我的检查方式
public static void main(String[] args) {
Map<String, Boolean> inputsAndExpectedResults = new HashMap<>();
inputsAndExpectedResults.put("1234", false);
inputsAndExpectedResults.put("4321", false);
inputsAndExpectedResults.put("1122", true);
inputsAndExpectedResults.put("8143", true);
inputsAndExpectedResults.put("1265", true);
inputsAndExpectedResults.put("9233", true);
inputsAndExpectedResults.put("9137", true);
inputsAndExpectedResults.put("2222", false);
inputsAndExpectedResults.put("4333", false);
inputsAndExpectedResults.put("5421", true);
inputsAndExpectedResults.put("6667", false);
inputsAndExpectedResults.put("4569", false);
inputsAndExpectedResults.put("1272", true);
Set<String> keySet = inputsAndExpectedResults.keySet();
for(String key : keySet) {
Boolean expectedValue = inputsAndExpectedResults.get(key);
boolean result = isPasswordValid(key);
String output = String.format("isPasswordValid(%s) returned %b expected %b", key, result, expectedValue);
if(expectedValue.equals(result))
System.out.println(output);
else
System.err.println(output);
}
}