[英]string comparison “=” != “+” , incorrect results
任務是檢查在以下給定條件下字符串結果是true還是false:
如果出現字母a到z,則它必須在特定字母之前和之后帶有“ +”。這可以很好地預期在字母之前或之后帶有“ =”的情況。 為什么此條件對於'='是錯誤的? 對於這些字符串,此代碼返回true謝謝
function SimpleSymbols(str) { var temp=str.split("") if(temp.length==1 || temp.length==2 ) return false; for(i=0;i<temp.length;i++){ if(temp[i]>='a' && temp[i]<='z'){ if(i===0 || i===(temp.length-1)|| (temp[i-1]!=='+' && temp[i+1]!=='+')){ return false; } } } return true; }
條件(temp[i-1]!=='+' && temp[i+1]!=='+')
如果這兩個字符之前和之后的信都沒有加號是唯一的真實。 如果其中之一是加號,則條件為假。
您需要將邏輯和更改為or運算符: (temp[i-1]!=='+' || temp[i+1]!=='+')
原始條件是一個字母被加號包圍:
temp[i-1] === '+' && temp[i+1] === '+'
在if
子句中,您測試此條件是否不匹配。 因此,原始條件變為:
!(temp[i-1] === '+' && temp[i+1] === '+')
要使用未等號變成一個條件這一點,你需要應用德摩根定律基本上說,如果你在一個否定因素的邏輯和成為或反之亦然。 這使得結果變為:
temp[i-1] !== '+' || temp[i+1] !== '+'
<!-- I think you should change the condition operator --> function SimpleSymbols(str) { var temp=str.split("") if(temp.length==1 || temp.length==2 ) return false; for(i=0;i<temp.length;i++){ if(temp[i]>='a' && temp[i]<='z'){ if(i===0 || i===(temp.length-1)|| (temp[i-1]!=='+' || temp[i+1]!=='+')){ return false; } } } return true; }
提示:還要檢查這些字符串,即使它們應該返回false,它們也都返回true。
"+a4"
"1a+"
"%a+"
讓我們簡化您的條件:
str[i-1] !== '+' && str[i+1] !== '+'
是相同的
!(str[i-1] === '+' || str[i+1] === '+')
這樣可以更輕松地查看您實際檢查的內容。
現在我們可以看到,條件str[i-1] !== '+' && str[i+1] !== '+'
僅在這兩個字符都不是+
情況下才返回true。
如果至少一個不是+
則希望它返回true。 因此,您應該改用以下代碼:
str[i-1] !== '+' || str[i+1] !== '+'
我在此正確的條件下重新編寫了您的代碼:
function SimpleSymbols(str) {
if (str.length == 1 || str.length == 2) return false;
for (var i = 0; i < str.length; i++) {
if (str[i] >= 'a' && str[i] <= 'z') {
if (i === 0 || i === (str.length-1) || (str[i-1] !== '+' || str[i+1] !== '+')) {
return false;
}
}
}
return true;
}
注意:正則表達式在這樣的字符串模式匹配方面可以提供很多幫助。
例如,您的整個函數將簡單地成為正則表達式:
function SimpleSymbols(str) {
return !str.match(/[^+][a-z][^+]/) && str.length > 2;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.