函数 isAlphabet 将接受字母,如果字母的顺序与字母表中的顺序匹配,则返回 true,否则为 false

function isAlphabet will take letters and return true if the order of the letters matches the order in the alphabet, otherwise false

提问人:Vladyslav Akopov 提问时间:3/2/2023 最后编辑:Peter SeligerVladyslav Akopov 更新时间:7/28/2023 访问量:289

问:

我需要实现这样的功能,如果字母的顺序与字母表中的顺序匹配,它将接受字母并返回,否则:isAlphabettruefalse

isAlphabet ('abc') === true
isAlphabet ('aBc') === true
isAlphabet ('abd') === false // - there is c after b
isAlphabet ('a') === true
isAlphabet ('') === false // - task not completed
isAlphabet ('abcdefghjiklmnopqrstuvwxyz') === false // - j goes after i
isAlphabet ('tuvwxyz') === true
isAlphabet ('XYZ') === true
isAlphabet ('mnoprqst') === false // - q goes before r

我的代码:

function isAlphabet(letters) {
    // write code here
    const char = letters.toLowerCase();
    for (let i = 0; i < char.length; i++) {
        if (char[i + 1] - char[i] !== 1) {
            return false;
        }
    }
    return true;
}

对于输入,该函数必须返回,但我上面的实现返回 。'abc'truefalse

你能帮我发现我的代码中的错误吗?


编辑

在根据一些建议更改代码后...

function isAlphabet(letters) {
  // write code here
  const ch = letters.toLowerCase();
  for (let i = 0; i < ch.length; i++) {
    if (ch[i + 1].charCodeAt() - ch[i].charCodeAt() !== 1) {
      return false;
    }
  }
  return true;
}

...该函数仍然出错。

JavaScript 数组 字符 序列 按字母顺序排列

评论

1赞 mykaf 3/2/2023
您对此有疑问吗?
1赞 mykaf 3/2/2023
它在哪个测试上出错了?
0赞 Armen Michaeli 3/3/2023
是什么让你想到(当你一开始就没有牢牢掌握问题域时,你能不能停止使用严格的比较运算符?使用——没有人愿意惊讶地阅读别人的代码),比较两个后续的字符序数吗?为什么?如果您比较 at 和 at 怎么办? 在字母表中排在前面,但它们之间的差值,正如您的表达式所计算的那样,是一个负数,大于......!==!=1'q'i'z'i + 1'q''z'1
2赞 VLAZ 3/3/2023
@ArmenMichaeli呃,是不是更令人惊讶的比较更令人惊讶。我绝对建议在几乎所有情况下都使用严格的比较。!==!=
1赞 VLAZ 3/3/2023
@ArmenMichaeli,是什么让你认为减去两个字母作为字符串会导致负数?

答:

0赞 Peter Seliger 3/3/2023 #1

从上面的评论中......

“提示......'a'.charCodeAt(0) - 'b'.charCodeAt(0) 等于 -1,而 'a'.charCodeAt(0) - 'c'.charCodeAt(0) 等于 -2,'aBc'.toLowerCase().split('') 的结果是 ['a', 'b', 'c']。——彼得·塞利格

“@PeterSeliger我遇到的错误不止一个。这是一个例子“——弗拉迪斯拉夫·阿科波夫

“@VladyslavAkopov......该提示已经提供了实现字母字符序列不区分大小写检测解决方案所需的一切。——彼得·塞利格

下一个(和注释的)代码示例确实证明了上述声明。

function isStrictAlphabeticalAscendingSequence(value) {
  // always ensure a string value.
  value = String(value);
  return (
    // ensure a non-empty string value ...
    value.length >= 1 &&
    // ... and ...
    value
      // ... a case insensitive ...
      .toLowerCase()
      // ... character sequence (array) ...
      .split('')
      // ... where ...
      // (the usage of `every` guarantees an early exit)
      .every((char, idx, arr) => {
        let result = true;
        if (idx < arr.length - 1) {
          result =
            // ... each next character is a direct follower
            // of its previous character in a strict
            // alphabetic ascending meaning.
            (arr[idx + 1].charCodeAt(0) - char.charCodeAt(0) === 1);
        }
        return result;
      })
   );
}

[
  'abc',
  'aBc',
  'abd',
  'a',
  '',
  'abcdefghjiklmnopqrstuvwxyz',
  'tuvwxyz',
  'XYZ',
  'mnoprqst',
]
.forEach(value =>
  console
    .log(`'${ value }' => ${ isStrictAlphabeticalAscendingSequence(value) }`)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

评论

0赞 Vladyslav Akopov 3/3/2023
function isAlphabet(letters) { // write code here const ch = letters.toLowerCase(); for (let i = 0; i < ch.length; i++) { if (ch[i + 1].charCodeAt() - ch[i].charCodeAt() !== 1) { return false; } } return true; }仍然是一个错误
0赞 Peter Seliger 3/3/2023
在哪些测试用例(OP 提供的字符串以及 OP 的期望)下,OP 最新提供的实现会失败?OP 认为(或每个)失败的根源是什么?
0赞 Peter Seliger 3/3/2023
@VladyslavAkopov......还鼓励 OP 根据 OP 最后提供的实现(上面的两个注释)编辑原始问题。
0赞 Peter Seliger 3/15/2023
@VladyslavAkopov......关于到目前为止唯一提供的答案/解决方案,还有什么问题吗?
0赞 Vladyslav Akopov 3/17/2023
不,谢谢。我用我的方式解决了问题。
0赞 Vitalii 7/28/2023 #2
  function isAlphabet(letters) {
   
   const lowercaseLetters = letters.toLowerCase();

      // If the string has less than two characters, the order cannot 
 be determined
     // But if the input is a single character, it can be considered 
   an alphabet
    if (lowercaseLetters.length < 2) {
   return lowercaseLetters >= 'a' && lowercaseLetters <= 'z';
 }

   for (let i = 1; i < lowercaseLetters.length; i++) {
         // Compare the ASCII codes of the current letter and the 
  previous one
     if (lowercaseLetters.charCodeAt(i) < 
   lowercaseLetters.charCodeAt(i - 1)) {
  return false;
}
    // Check if the current letter is the same as the previous one
      // If it is, it's not an alphabet sequence

      if (lowercaseLetters[i] === lowercaseLetters[i - 1]) {
  return false;
}
    // Check if there are missing characters in the sequence

   if (lowercaseLetters.charCodeAt(i) - 
       lowercaseLetters.charCodeAt(i- 1) > 1) {
  return false;
}

}

返回 true; }