【问题标题】:How to move all capital letters to the beginning of the string?如何将所有大写字母移动到字符串的开头?
【发布时间】:2020-11-08 15:15:41
【问题描述】:

我一直在使用我所学/已知的知识来练习简单的解决方案。 我面临的问题是,如何将字符串中的大写字母移到前面?

我已经解决了,但这并不符合我的预期,因为我最初的想法是 → 找到大写字母 → 将它们放入数组中 → 将大写字母与原始字符串数组连接起来,其中删除了大写字母。

因此我的问题是,如何删除第一个条件语句中的大写字母,这样我就不需要创建另一个条件语句来查找小写字母并将小写字母存储在数组中?

例如,输入字符串为'heLLo' → 输出为'LLheo'(大写字母现在在前面)。

谢谢!

function capToFront(s) {
    var sp = s.split("");
    var caps = []; 
    var lower = []
    for (var i = 0; i < sp.length; i++)
        {
            if (sp[i] == sp[i].toUpperCase()){              
                caps.push(sp[i]);
           **//How can i remove the capital letter in "sp" array as I've pushed them into the caps Array**

            }
            if (sp[i] == sp[i].toLowerCase()){
                lower.push(sp[i]);
            }
        }
    return caps.join("").concat(lower.join(""));
}

【问题讨论】:

  • 提供输入数组和预期输出数组会很有帮助!
  • caps.push(s[i]) 之后执行sp.splice(i, 1)。然后最后你可以只做....concat(sp.join("")),不需要第二个if

标签: javascript string case-sensitive uppercase letter


【解决方案1】:

您也可以尝试这种方法,检查字符的 ASCII 值,因为大写字母位于 65 and 90 之间,然后在数组上相应地使用 .sort.join 方法

function capToFront(s) {
    var sp = s.split("");
    const res = sp.sort((a,b)=> isCaps(a) ? isCaps(b) ? 0 : -1 : 0)
    return res.join("")
}

function isCaps(c){
  return c.charCodeAt()>=65 && c.charCodeAt()<=90
}

console.log(capToFront('hIsAmplEStRing'))

【讨论】:

    【解决方案2】:

    您可以使用 Regex 以更小的循环来实现目标。

    function capToFront(sp) {
        let upperRgx = /[A-Z]/g;
        let upperLetters = sp.match(upperRgx);
        for(let i=0; i < upperLetters.length;i++) {
            let indx = sp.indexOf(upperLetters[i]);
          sp = sp.substring(0,indx)+sp.substring(indx+1,sp.length);
        }
        sp = upperLetters.join("")+sp;
        
        return sp;
    }
    
    console.log(capToFront("heLLo")) // Output: LLheo

    【讨论】:

      【解决方案3】:

      使用RegExp,您可以在一行中完成您的目标而无需任何循环:

      const result = [...'heLLo'].sort(l => /[A-Z]/.test(l) ? -1 : 0).join('');
      
      console.log(result); // LLheo

      如果要确保保留大写字母之间的原始顺序,它会稍微长一些:

      const result = [...'Hello World Foo Bar']
        .sort((a, b) => /[A-Z]/.test(a) ? /[A-Z]/.test(b) ? 0 : -1 : 0)
        .join('');
      
      console.log(result); // HWFBello orld oo ar

      【讨论】:

      • 您好,谢谢!但不幸的是,我一直很难理解正则表达式,因为我似乎无法掌握基础,因此求助于循环的基础知识。但是,是的,谢谢您的回答!我将选择您的答案以获得理想的解决方案。但我也很想知道如何使用 splice。
      • /[A-Z]/.test(a) 返回true 如果a 是从AZ 的任何字母。希望有帮助!
      【解决方案4】:

      使用Splice方法删除。

      function capToFront(s) {
          var sp = s.split("");
          var caps = []; 
          var lower = []
          for (var i = 0; i < sp.length; i++)
              {
                  if (sp[i] == sp[i].toUpperCase()){              
                      caps.push(sp[i]);
                      // Use the `splice` method to remove
                      sp.splice(i, 1);
                  }
                  if (sp[i] == sp[i].toLowerCase()){
                      lower.push(sp[i]);
                  }
              }
          console.log('sp', sp);
          return caps.join("").concat(lower.join(""));
      }
      
      console.log(capToFront("stAck"))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-25
        • 2021-03-12
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多