RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1339553
Accepted
Demon __
Demon __
Asked:2022-03-18 20:57:47 +0000 UTC2022-03-18 20:57:47 +0000 UTC 2022-03-18 20:57:47 +0000 UTC

计算并返回行数的任务

  • 772

有一条线。

const stringCount = "ggggaaaazzzzzlllllluuuuuuuuu";

任务是编写一个函数来计算字符数并返回这样的结果g4a4z5l6u9

我得到了以下非工作代码

const str = "ggggaaaazzzzzlllllluuuuuuuuu";


const strNumeric = (str) => {
  let counter = 0,
    currentItem = str[0],
    arr = [];
  [...str].forEach((iterator) => {
    if (iterator !== currentItem) {
      currentItem = iterator;
      arr = [...arr, `${currentItem}${counter}`];
      counter = 0;
    } else {
      counter += 1;
    }
  });
  console.log(arr);
};

console.log(strNumeric(str));

执行此代码的结果是

[
  "a4",
  "z3",
  "l4",
  "u5"
]

第二次尝试

const str = "ggggaaaazzzzzlllllluuuuuuuuu";
    
const strNumeric = (str) => {
  let main = [],
    count = 0,
    arr = [];

  [...str].forEach((a) => {
    if (!arr.includes(a)) {
      count = str.match(/a/g, "").length;

      arr = [...arr, a];
      main = [...main, `${a}${count}`];
    } else {
      count = 0;
    }
  });
  console.log(main);
};

strNumeric(str);

它非常接近这里的解决方案。

我教这样一个数组-> ["g4", "a4", "z4", "l4", "u4"]

问题出在这一行->count = str.match(/a/g, "").length;

在这里,出于某种原因,我总是得到 4。为什么还不清楚。

我希望看到一个更易于理解的实现,请不要使用单行函数和单字符变量。

javascript
  • 6 6 个回答
  • 10 Views

6 个回答

  • Voted
  1. Алексей Обухов
    2022-03-18T22:56:42Z2022-03-18T22:56:42Z

    我的想法是这样的:在一个循环中计数成一个关联数组,其中键是一个字符,值是字符串中的字符数。很抱歉简化了您的代码。我不知道宝贝。

    const str = "ggggaaaazzzzzlllllluuuuuuuuu";
    
    
    function strNumeric(s) {
      var tmp = [];
      for (var i = 0; i < s.length; i++) {
        var c = s[i];
        tmp[c] = tmp[c] ? tmp[c] + 1 : 1;
      }
    
      var res = "";
      for (var c in tmp) {
        res += c + tmp[c];
      }
      return res;
    }
    
    console.log(strNumeric(str));

    • 2
  2. Best Answer
    user176262
    2022-03-18T23:06:53Z2022-03-18T23:06:53Z

    如果字母被分组:

    const str = "ggggaaaazzzzzlllllluuuuuuuuu";
    
    function strNumeric(s) {
      let r = '';
      while(s) {
        const a = s[0];
        const newS = s.replace(new RegExp(a, 'g'), '');
        r += a + (s.length - newS.length);
        s = newS;
      }
      return r;
    }
    
    console.log(strNumeric(str));

    如果同一个字母有多个组:

    const str = "ggggaaaazzzzzlllllluuuuuuuuugggggg";
    
    function strNumeric(s) {
      let r = '';
      let count = 1;
      for (let i = 1; i <= s.length; i++) {
        if (s[i] != s[i - 1]) {
          r += s[i - 1] + count;
          count = 0;
        }
        count++;
      }
      return r;
    }
    
    console.log(strNumeric(str));

    • 1
  3. Demon __
    2022-03-18T23:30:52Z2022-03-18T23:30:52Z

    解决方案:

    const str = "ggggaaaazzzlllllluuuuuuuuu";
    
    const strNumeric = (str) => {
      let main = [],
        count = 0,
        arr = [];
    
      [...str].forEach((item) => {
        if (!arr.includes(item)) {
          count = str.match(new RegExp(item, "g")).length;
    
          arr = [...arr, item];
          main = [...main, `${item}${count}`];
        } else {
          count = 0;
        }
      });
      return main;
    };
    
    console.log(strNumeric(str).join(""));

    谢谢大家的回复,大家点赞。

    • 1
  4. Randall
    2022-03-20T02:07:19Z2022-03-20T02:07:19Z

    有点类似于@Igor 的回答——我

    const stringCount = "ggggaaaazzzzzlllllluuuuuuuuu";
    
    const strNumeric = (str) => {
      // Это строка будет содержать результат выполнения функции в виде строки
      let countedStr = ''; 
      // Переменная для отслеживания повторяющихся символов
      let count = 0; 
    
      // Если у нас пустая строка выходим из выполнения функции
      if ( str.length === 0 ){
        return;
      } 
    
      /* 
      * Обычный цикл for для перебора строки
      * Отличие от привычного метода forEach который вы используете в том что
      * тут не нужна разбивка через метод split либо спред оператора
      */    
      for(let i = 0; i < str.length; i++){
        // Счетчик для каждого повторяющегося символа
        count++;
        if (str[i] !== str[i + 1]){
          // Если символ не тот который был ранее добавляем его в countedStr 
          // вместе с count и сбрасываем count
          countedStr += str[i] + count;
          count = 0;
        }
      }
      return countedStr;
    }
    
    console.log(strNumeric(stringCount));

    还有一种替代算法可以做相反的事情

    由此"g4a4z5l6u9"使这个->"ggggaaaazzzzzlllllluuuuuuuuu"

    const countString = "g4a4z5l6u9";
    
    const strNumeric = (str) => {
      let splittedString = str.split("");
      
      for(let i = 1; i < splittedString.length; i++) {
         if (!isNaN(splittedString[i]) && !isNaN(splittedString[i - 1])) {
          splittedString[i - 1] = splittedString[i - 1] + splittedString[i];
          splittedString.splice(i, 1);
         }
      }
      for (let i = 1; i < splittedString.length; i++ ){
        if ( !isNaN(splittedString[i]) ){
          splittedString[i - 1] = splittedString[i - 1].repeat(Number(splittedString[i]));
          splittedString.splice(i, 1);
        }
      }
      return splittedString.join("");
    };
    
    console.log(strNumeric(countString))

    稍后我将在第二个代码中添加注释。

    • 1
  5. WalkMess
    2022-03-18T23:00:05Z2022-03-18T23:00:05Z

    我给你写了一个函数,它会返回一个对象,现在你可以用这个数据做任何你想做的事情。

    const getBufferCountingСharacters = (characters) => {
      buffer = {};
      for (let i = 0; i < characters.length; i++) {
        const character = characters[i];
    
        if (characters.match(new RegExp(character, 'g')).length > 1) {
          buffer[character] = characters.match(new RegExp(character, 'g')).length;
        }
      }
      return buffer;
    };
    
    console.log(getBufferCountingСharacters('ggggaaaazzzzzlllllluuuuuuuuu'));

    Однако вот вам решение требующее именно нужный результат. 
    

    const str = Object.entries(getBufferCountingСharacters('ggggaaaazzzzzlllllluuuuuuuuu')).flat().join(''); 
    console.log(str);

    Обратите внимания, что для работы нужна функция написанная выше.
    
    • 0
  6. RunDevil
    2022-03-18T23:17:26Z2022-03-18T23:17:26Z

    试试这样:

    let strNumeric = (str) => {
        let map = {};
        let result = "";
    
        [...str].forEach((char) => {
            !map[char] ? map[char] = 1 : map[char] = map[char] + 1;
        })
    
        for(let char in map){
            result += char + map[char]
        }
    
        return result;
    }
    
    • 0

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5