【问题标题】:return the total number of upper case characters in an array of strings [closed]返回字符串数组中大写字符的总数[关闭]
【发布时间】:2019-12-30 23:33:58
【问题描述】:

正如标题所说,我试图在接受字符串数组的函数中返回大写字符的总数。

这是我目前所拥有的:

function totalCaps(str) {
  var count=0,len=str.length;
  for(var i=0;i<len;i++) {
    if(/[A-Z]/.test(str.charAt(i))) count++;
  }
  return count;
}

console.log(
  totalCaps(["AwesomE", "ThIngs", "hAppEning", "HerE"])
  );

我这样做是最好的方法吗?我确信有一个替代解决方案来比较我正在做的事情。

我正在尝试返回:8 用于我在底部介绍的给定字符串数组。

【问题讨论】:

标签: javascript


【解决方案1】:

如果“字符串数组中的大写字符总数”对您很重要,我想您可以稍微重构数据以减少任务:

  1. 将字符串连接到 1 个长字符串:
 ["sldkDSgj", "sldTd", "slpiasSPA", ...].join('') // "sldkDSgjsldTdslpiasSPA..."
  1. 使用String.match 接收与您的模式匹配的数量:
const pattern = /[A-Z]/g
"sldkDSgjsldTdslpiasSPA...".match(pattern).length // 6

【讨论】:

  • 还没想好,不错!
  • return str.join('').match(/[A-Z]/g).length 会工作
【解决方案2】:
function totalCaps(str) {
    var count = 0;
    str.map(item => {
        for (var i=0; i < item.length; i++) {
            if (item[i] == item[i].toUpperCase()) count ++;
        }
    })
    return count;
}

console.log(
    totalCaps(["AwesomE", "ThIngs", "hAppEning", "HerE"])
);

【讨论】:

    【解决方案3】:

    请注意,您建议的解决方案处理单个字符串,而不是字符串列表。为了让它工作,你可以遍历给定的数组:

    function totalCaps(arr) {
        var count = 0;
        arr.forEach(str => {
            const len = str.length;
            for (var i=0 ; i < len; i++) {
                if (/[A-Z]/.test(str.charAt(i))) {
                    count++;
                }
            }
        });
        return count;
    }
    

    【讨论】:

      【解决方案4】:

      您的代码实际上不会工作,因为您的函数假定它正在获取单个字符串,但您正在传递一个数组。但是,这很容易解决,所以我不会解决它。这是一个简单的解决方案。我相信其他人会发布变体和替代方案:

      function totalCaps(strAry) {
          return strAry
              .join('') // join all strings into one string
              .split('') // split string into array of characters
              .reduce((accum, ch) => accum + (/[A-Z]/.test(ch) ? 1 : 0), 0);
      }
      
      console.log(
          totalCaps(['AwesomE', 'ThIngs', 'hAppEning', 'HerE'])
      );
      

      【讨论】:

        【解决方案5】:

        编辑(如果您需要 O(n),两种方法都是 O(n2),请参阅 shukar 答案)

        这是一个快速的解决方案。由于您有一个数组遍历每个项目,因此在下一个内部循环中遍历当前字符串的字符并检查该字符是否为大写。

        function totalCaps(arr) {
          let count = 0,
            len = arr.length;
          for (let i = 0; i < len; i++) {
            const word = arr[i];
            for (let j = 0; j < word.length; j++) {
              if (word[j].toUpperCase() === word[j]) {
                count++
              }
        
            }
          }
          return count;
        }
        
        console.log(
          totalCaps(["AwesomE", "ThIngs", "hAppEning", "HerE"])
        );

        这是一个函数式方法

        function totalCaps(arr) {
          return arr.reduce((acc, cur) => acc + cur.split('').reduce((acc_2, x) => x.toUpperCase() === x ? ++acc_2 : acc_2, 0), 0)
        }
        console.log(totalCaps(["AwesomE", "ThIngs", "hAppEning", "HerE"]))
        

        【讨论】:

        • @CodyWürth 我编辑了答案以使其更具代码可读性
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 2013-03-18
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多