2020-02-21

给定数组 [‘1a’,'2b','3c','5a'] ,输出出现次数最多的字母前数字之和: 6。

// 或许会有类似这样 "11ad" 的元素 ? 不会,每个元素中只会有一个字母,case可作为边界条件考虑

// let calculateSum = (list = []) => {
//   const reg = /^(\d+)([a-zA-Z]+)/;
//   let wordMap = new Map();

//   for (let i = 0; i < list.length; i++) {
//     const item = list[i];
//     if (reg.test(item)) {
//       const res = reg.exec(item);
//       const number = Number(res[1]);
//       const word = res[2];

//       if (word.length !== 1) {
//         console.error(`输入数组的第 ${i + 1} 个数据项格式错误,请更正!`)
//         break;
//       }
//       const val = wordMap.get(word);
//       wordMap.set(word, {
//         appearCount: val ? val.appearCount + 1 : 1, // 字母出现次数
//         sumNumber: val ? val.sumNumber + number : number, // 该字母前的数字之和
//       });
//     } else {
//       console.error(`输入数组的第 ${i + 1} 个数据项格式错误,请更正!`)
//       break;
//     }
//   }

//   console.log(wordMap);
//   let maxCount = 0, maxSum = 0;
//   wordMap.forEach((item) => {
//     const { appearCount, sumNumber } = item;
//     if (appearCount > maxCount) { // 对比出现次数
//       maxCount = appearCount;
//       maxSum = sumNumber;
//     }
//   })

//   console.log(maxSum);
//   return maxSum;
// }

// calculateSum(['1a', '2b', '3c', '5a']);

// 第一次跑失败:node 执行文件 路径错误
// 第二次跑失败:输出15,发现加和时 发生了字符串拼接
// 第三次跑成功:时间复杂度 O(2n),空间复杂度 O(n),开始优化:

let calculateSum = (list = []) => {
  const reg = /^(\d+)([a-zA-Z]+)/;
  let wordMap = new Map(), maxCount = 0, maxSum = 0;

  for (let i = 0; i < list.length; i++) {
    const item = list[i];
    if (reg.test(item)) {
      const res = reg.exec(item);
      const number = Number(res[1]);
      const word = res[2];

      if (word.length !== 1) {
        console.error(`输入数组的第 ${i + 1} 个数据项格式错误,请更正!`)
        break;
      }
      const val = wordMap.get(word);
      wordMap.set(word, {
        appearCount: val ? val.appearCount + 1 : 1, // 字母出现次数
        sumNumber: val ? val.sumNumber + number : number, // 该字母前的数字之和
      });

      const { appearCount, sumNumber } = wordMap.get(word);
      if (appearCount > maxCount) { // 对比出现次数
        maxCount = appearCount;
        maxSum = sumNumber;
      }
    } else {
      console.error(`输入数组的第 ${i + 1} 个数据项格式错误,请更正!`)
      break;
    }
  }
  console.log(wordMap);
  console.log(maxSum);
  return maxSum;
}

calculateSum(['1a', '2b', '3c', '5a']);

// 第四次跑成功:优化成功,合并为一次循环,时间复杂度 O(n),空间复杂度 O(n)

// 考虑到多个字母出现次数相同的case,如:
calculateSum(['1a', '2b', '3c', '9a', '23b']);

// 该测试用例中 a 和 b 都出现两次,输出了 a 前面的数字加和。
// 原因是:a先遍历加和完成,根据条件 if (appearCount > maxCount) 会输出a的结果

考虑将空间复杂度降为 O(1)?哪位大侠写出来给留个言吧,我实现不了了😫

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java中二维数组array.length和array[i].length的区别及实例Java中二维数组array...
    夏日柠檬哈阅读 39评论 0 0
  • #数据结构之动态数组的创建 ##关于二维数组与一位数组的互相转换 ①如1 2 3 4 5 6 7 8 9 10这一...
    王登登阅读 36评论 0 0
  • 面对疫情,我们该如何挽回公司的经济 龙观集团是一家集产业园区运营、众筹众创服务、高校专业共建、风险投资、财务管理...
    XH123456FLY阅读 1,332评论 0 1
  • if else 嵌套优化 各个分支控制下的代码如下: 优化后 RuleMap是所有判断规则和其执行方法的合集,Ru...
    橙汁坤阅读 4,174评论 0 0
  • 一条路 贯穿生命始末 一条路 越过春夏秋冬 这条路 不是山路 却曲折无比 不是水路 却飘渺无垠 不是天路 能直达浩...
    澎湃简报阅读 1,774评论 0 4