将字符串的小写字母转换为大写字母,反之亦然

Turn lowercase letters of a string to uppercase and the inverse

let message = "heY, WHAt are you dOING?";
let count_changes = 0;
let isLetter = (letter) => {
    if (('a'<=letter && letter >='z') || ('A'<=letter && letter >='Z')) {
        return letter;
    } else {
        return -1;
    }
}

for(let i = 0; i <= message.length; i++) {
    if (isLetter(i) && message[i].toLowerCase()) {
        message[i].toUpperCase();
        count_changes++;
        console.log(message[i].toLowerCase());
    }
    else if (isLetter(i) && message[i].toUpperCase()) {
        message[i].toLowerCase();
        count_changes++;
    }
    else {
        console.error('Bad stirng');
    }
}

你好,我想使用函数 isLetter 来检查字符串消息的每个字符,当我在 for 循环中使用 isLetter 来检查 if 语句是否是字母以及稍后是否是小写字母时当大写字母发生变化时,我会增加 count_changes++。再次使用第二个 if 语句 if also i is Letter 并且在这种情况下是大写字母然后 if 更改为小写字母以增加 count_changes++ 所以 count_changes 是我的最终结果 谢谢

TL;DR:

let message = "heY, WHAt are you dOING?";
let newMessage = "";
let count_changes = 0;
let isLowerCaseLetter = (letter) => 'a' <= letter && letter <= 'z';
let isUpperCaseLetter = (letter) => 'A' <= letter && letter <= 'Z';

/* Iterate over every character of the message. */
for (let i = 0; i < message.length; i++) {
  /* Cache the character at the current index. */
  let character = message[i];

  /* Check whether the character is a lowercase letter. */
  if (isLowerCaseLetter(character)) {
    newMessage += character.toUpperCase();
    count_changes++;
  }

  /* Check whether the character is an uppercase letter. */
  else if (isUpperCaseLetter(character)) {
    newMessage += character.toLowerCase();
    count_changes++;
  }
  
  /* Otherwise, just add the current character to the new message. */
  else newMessage += character;
}

console.log("New Message: ", newMessage);
console.log("Changes: ", count_changes);


你的错误:

  1. 由于 >='z',您检查字符是否为字母的方式是错误的。应该是<='z'。针对 'Z'.

  2. 的检查也是如此
  3. 具有布尔含义的函数最好是 return truefalse 而不是 -1 或字符本身。

  4. isLetter 中,您传递索引而不是字符本身。函数调用应该是 isLetter(message[i]) 而不是 isLetter(i).

  5. 您正在测试的邮件将被视为 'bad string',因为单词之间有逗号和空格。

  6. 在你的循环中,条件应该是i < message.length,否则,每条消息都将被视为'bad string',因为你'将超出所有字符并获得 undefined 值。

  7. 方法toLowerCasetoUpperCase不影响原始字符串,而是创建一个新字符串。如果你想 assemble 将结果字符放在一起,你必须初始化一个 newMessage 字符串并将它连接到每个循环中处理过的字符。

建议的解决方案:

  1. 而不是创建一个 isLetter 函数,创建一个检查字符是否为小写字母和一个检查字符是否为大写字母的函数。这样你就可以结合你的检查,你的 if 子句会更简单,更易读。

  2. 完全放弃 isLetter 检查和好字符串/坏字符串,以免 in-between 字符(如空格和标点符号)出现问题。

  3. 尽量减少函数调用,对于大字符串,它们会大大降低您的代码速度。在下面的代码中,与接受的答案相比,每个循环仅使用 2 次函数调用 ,这使得:

    • 每个循环调用 3 次函数,
    • 3 函数在字符为字母时调用 (大部分时间)
    • 3 one-time 函数调用 frommapjoin,这对大字符串很重要。

速度测试:

在使用大量字符串(2,825,856 个字符长)的一系列 5 项测试中,答案如下:

  • 这个答案jsFiddle使用)[1141.91ms, 1150.93ms, 1093.75ms, 1048.50ms, 1183.03ms]

  • 已接受的答案jsFiddle已使用)[2211.30ms, 2985.22ms, 2136.73ms, 2279.26ms, 2482.34ms]

据我了解,您想计算字符串中的字符数和 return 一个字符串,其中所有大写字符都替换为小写字符,所有小写字符都替换为大写字符。此外,您想为每个更改的字符增加一次 countChanges。

这段代码应该可以满足您的需求:

let message = "heY, WHAt are you dOING?";
let countChanges = 0;
let isLetter = c => c.toLowerCase() !== c.toUpperCase();
let isLowerCase = c => c.toLowerCase() === c;

let flippedMessage = Array.from(message).map((c)=>{
    if(!isLetter(c)){
        return c;
    }
    countChanges++;
    // return uppercase character if c is a lowercase char
    if(isLowerCase(c)){
        return c.toUpperCase();
    }
    // Here, we know c is an uppercase character, so return the lowercase
    return c.toLowerCase();
}).join('');

// flippedMessage is "HEy, whaT ARE YOU Doing?"
// countChanges is 18

默认情况下,javascript 的字符串比较区分大小写,因此您可以通过将字符与大写或小写转换值进行比较来检查字符的大小写。

如果相同,那么就是你检查的大小写,如果不一样,那么就是不同的大小写。

"TRY" == "TrY" 会 return false,而 "TRY" == "TRY" 会 return true;

所以,用一个变量来表示检查的最后一个字母的大小写,然后将下一个字母与相反的大小写进行比较。如果匹配,则大小写已经改变,否则仍然是相同的大小写。

isLetter 函数检查一个值是否为单个字符,并使用正则表达式测试确保它是一个字母 - 没有标点符号或数字等。

你的循环总是会产生错误,因为你在消息字符串的长度之外迭代 - 数组是基于 0 的。

let message = "heY, WHAt are you dOING?";
let count_changes = 0;
let lowerCase = message[0] == message[0].toLowerCase();
let messageLength = message.length;

function isLetter (val) {
    // Check val is a letter of the alphabet a - z ignoring case.
    return val.length == 1 && val.match(/[a-z]/i);
}

for (let i = 0; i < messageLength; i++) {
    var char = message[i];
    if (isLetter(char)) {
        if(lowerCase) {
            // Check to see if the next letter is upper case when the last one was lower case.
            if(char == char.toUpperCase()) {
                lowerCase = false;
                count_changes++;
            }
        }
        else {
            // Check to see if the next letter is lower case when the last one was upper case.
            if(char == char.toLowerCase()) {
                lowerCase = true;
                count_changes++;
            }
        }
    }
    else {
        // Found a non-letter character.
        console.error('Not a letter.');
    }
}

console.log("Number of times the case changed: " + count_changes);