出现最多的字符串

这是用String本身的方法实现(es6的新增方法不太熟悉,基本上es5的);

  1. 使用String的match方法
  • 用正则匹配返回是的匹配到的字符串的数组
  • 用string匹配,则返回一个类似 ["a", index: 2, input: "dfas"]
  • 没有匹配,则返回null
function getMostChar(str) {
  //出现的字符
  var most_char = '';
  var char = '';
  var char_arr = [];

  //出现的次数
  var most_count = 0;
  var count = 0;
  var count_arr = [];

  var len = str.length;
  if (len > 1) {
    (function() {
      for (var i = 0; i < len; i++) {

        char = str[i];

        var flag = char_arr.some(function(item, index) {
          return item == char;
        })

        if (!flag) {
          char_arr.push(char);

          var pattern = new RegExp(char, 'g');
          var result = str.match(pattern);
          if (result) {
            count = result.length;
          }
          
          count_arr.push(count);
        }

        if (most_count < count) {
          most_count = count;
          most_char = char;
        }
      }
    })()
  } else {
    char_arr.push(str);
    most_count = len;
    most_char = str;
  }
  console.log('拥有的字符的种类:' + char_arr, ';出现最多次数的字符:' + most_char, ';出现的次数的数组:' + count_arr, ';出现最多次数:' + most_count);
}
  1. indexOf 和 do{}while()
  • indexOf() 返回字符出现的第一次的位置,没有匹配则返回-1
  • idnexOf(str,startpos) 的有两个参数
    • str 匹配的字符
    • startpos {type number} 设置从字符串的开始匹配位置(包含这个startpos)
  • do{}while() 错误的也得执行一次
function getMostChar(str) {
  //出现的字符
  var most_char = '';
  var char = '';
  var char_arr = [];

  //出现的次数
  var most_count = 0;
  var count = 0;
  var count_arr = [];

  //字符串出现的位置
  var pos = -1;

  var len = str.length;
  if (len > 1) {
    (function() {
      for (var i = 0; i < len; i++) {
        char = str[i];
        var flag = char_arr.some(function(item, index) {
          return item == char;
        })

        if (!flag) {
          char_arr.push(char);

          do {
              count++;
              pos = str.indexOf(char, pos+1);
          } while(pos>-1)
          if(i===0){
            count = count-1;
          }
          
          count_arr.push(count);
        }

        if(most_count < count){
          most_count = count;
          most_char = char;
        }

        //重置为下次遍历做准备
        count = 0;
        // 已经检测过不在检测,对pos设置为当前位置
        pos = i+1;
      }
    })()
  } else {
    char_arr.push(str);
    most_count = len;
    most_char = str;
  }
  console.log('pos: ' + pos, ';拥有的字符的种类:' + char_arr, ';出现最多次数的字符:' + most_char, ';出现的次数的数组:' + count_arr, ';出现最多次数:' + most_count);
}

while 类似

function getMostChar(str) {
  //出现的字符
  var most_char = '';
  var char = '';
  var char_arr = [];

  //出现的次数
  var most_count = 0;
  var count = 0;
  var count_arr = [];

  //字符串出现的位置
  var pos = 0;

  var len = str.length;
  if (len > 1) {
    (function() {
      for (var i = 0; i < len; i++) {
        char = str[i];
        var flag = char_arr.some(function(item, index) {
          return item == char;
        })

        if (!flag) {
          char_arr.push(char);

          while(pos>-1) {
              count++;
              pos = str.indexOf(char, pos+1);
          } 

          count_arr.push(count);
        }

        if(most_count < count){
          most_count = count;
          most_char = char;
        }

        //重置为下次遍历做准备
        count = 0;
        pos = i+1;
      }
    })()
  } else {
    char_arr.push(str);
    most_count = len;
    most_char = str;
  }
  console.log('pos: ' + pos, ';拥有的字符的种类:' + char_arr, ';出现最多次数的字符:' + most_char, ';出现的次数的数组:' + count_arr, ';出现最多次数:' + most_count);
}
  1. 用search 方法实现,其实逻辑同indexOf是一样的。只不过要利用字符串的截取方法。
function getMostChar(str) {
  //出现的字符
  var most_char = '';
  var char = '';
  var char_arr = [];

  //出现的次数
  var most_count = 0;
  var count = 0;
  var count_arr = [];

  //字符串出现的位置
  var pos = 0;
  var sub_str = '';
  var sub_str_pos = 0;

  var len = str.length;
  if (len > 1) {
    (function() {
      for (var i = 0; i < len; i++) {
        char = str[i];
        var flag = char_arr.some(function(item, index) {
          return item == char;
        })

        if (!flag) {
          char_arr.push(char);

          var pattern = new RegExp(char, 'g');

          while (sub_str_pos > -1) {
            count++;
            sub_str = str.slice(pos+1);
            sub_str_pos = sub_str.search(pattern);
            pos = (pos + 1) + sub_str_pos;
          }

          count_arr.push(count);
        }

        if (most_count < count) {
          most_count = count;
          most_char = char;
        }

        //重置为下次遍历做准备
        pos = i + 1;
        count = 0;
        sub_str = '';
        sub_str_pos = 0;
      }
    })()
  } else {
    char_arr.push(str);
    most_count = len;
    most_char = str;
  }
  console.log('pos: ' + pos, ';拥有的字符的种类:' + char_arr, ';出现最多次数的字符:' + most_char, ';出现的次数的数组:' + count_arr, ';出现最多次数:' + most_count);
}
  1. replace ,这是最最简单的,最好理解。
function getMostChar(str) {
  //出现的字符
  var most_char = '';
  var char_arr = [];

  //出现的次数
  var most_count = 0;
  var count = 0;
  var count_arr = [];

  var new_char = str[0];
  var len = str.length;

  while (str) { // 实际上是这样子的 while(str !== '')
    char_arr.push(new_char);

    var pattern = new RegExp(new_char, 'g');
    str = str.replace(pattern, '');

    count = len - str.length;
    count_arr.push(count);
    if (most_count < count) {
      most_count = count;
      most_char = new_char;
    }
    // 重置
    len = str.length;
    new_char = str[0];
  }

  console.log('拥有的字符的种类:' + char_arr, ';出现最多次数的字符:' + most_char, ';出现的次数的数组:' + count_arr, ';出现最多次数:' + most_count);
}
  1. split 这个方法使用起来实际上是把字符串变成数组,那就不是String方法。所以没做下去。

这个有什么好玩性了,可以检测作者是怎么用词,检测他用词。

例如,我找汪曾祺的《异秉》,测试:

var str = '小说的内容';

getMostCharSort(str);

function getMostCharSort(str) {
  var kv_arr = [];

  //出现的字符
  var char = str[0];
  var most_char = '';
  var char_arr = [];

  //出现的次数
  var most_count = 0;
  var count = 0;
  var count_arr = [];

  var len = str.length;

  while (str) { 

    var pattern = new RegExp(char, 'g');
    str = str.replace(pattern, '');

    if (!(/\,|\。|\:|\“|\”|\?|\!|\s|\、|\—|\(|\)/ig.test(char))) {

      char_arr.push(char);
      count = len - str.length;

      kv_arr.push({
        count: count,
        char: char
      });

      count_arr.push(count);
      if (most_count < count) {
        most_count = count;
        most_char = char;
      }
    }
    // 重置
    len = str.length;
    char = str[0];
  }

  console.log('拥有的字符的种类:' + char_arr);
  console.log('出现最多次数的字符:' + most_char);
  console.log('出现的次数的数组:' + count_arr, );
  console.log('出现最多次数:' + most_count);

  des(kv_arr)

  show(kv_arr);
}

function show(arr) {
  var table = document.createElement('table');
  var table_html = '<tr><td>字符</td><td>次数</td></tr>' 
    + '<tr><td>'+ '字的种类:' +'</td><td>' + arr.length + '</td></tr>';

  arr.forEach(function(item, index) {
    table_html = table_html + ('<tr ><td>' + item.char + '</td><td> ' + item.count + '</td></tr>');
  })

  table.innerHTML = table_html;
  document.body.appendChild(table);
}

function des(arr){
  for(var i = 0; i < arr.length; i++){
    for(var j = arr.length-1; j > i; j--) {
      if(arr[i].count <= arr[j].count) {

        var des_count = arr[j].count;
        var des_char = arr[j].char;

        arr[j].count = arr[i].count;
        arr[j].char = arr[i].char;

        arr[i].count = des_count;
        arr[i].char = des_char;
      }
    }
  }
}

我们将算法改进,不在用冒泡。

function getMostCharSort(str) {
  var kv_arr = [];

  //出现的字符
  var char = str[0];

  //出现的次数
  var most_count = 0;
  var less_count = 0;
  var center_count = 0;
  var center_index = 0;
  var count = 0;

  var len = str.length;

  while (str) { // 实际上是这样子的 while(str !== '')

    var pattern = new RegExp(char, 'g');
    str = str.replace(pattern, '');
    // 去掉一些特殊的符号
    if (!(/\,|\。|\:|\“|\”|\?|\!|\s|\、|\—|\(|\)/ig.test(char))) {
      count = len - str.length;

      if (count >= most_count) {
        kv_arr.unshift({
          count: count,
          char: char
        });

        center_index ++;
        center_count = kv_arr[center_index];

        most_count = count;
        if(kv_arr.length == 1){
          less_count = count;
        }
      } else {
        if (count > center_count) {
          for (var j = center_index - 1; j > 0; j--) {
            if (count < kv_arr[j]) {
              kv_arr.splice(j, 0, {
                count: count,
                char: char
              })
            }
            center_count++
            center_count = kv_arr[center_index];
          }
        } else {
          if (count <= less_count) {
            kv_arr.push({
              count: count,
              char: char
            })
            less_count = count;
          } else if(count > less_count) {
            var less_index = kv_arr.length;
            for (var i = center_index + 1; i < less_index; i++) {
              if (count > kv_arr[i]) {
                kv_arr.splice(i-1,0,{
                  count: count,
                  char: char
                })
              }
            }
          }
        }
      }
    }
    len = str.length;
    char = str[0];
  }

  show(kv_arr);
}

function show(arr) {
  var table = document.createElement('table');
  var table_html = '<tr><td>字符</td><td>次数</td></tr>' +
    '<tr><td>' + '字的种类:' + '</td><td>' + arr.length + '</td></tr>';

  arr.forEach(function(item, index) {
    table_html = table_html + ('<tr ><td>' + item.char + '</td><td> ' + item.count + '</td></tr>');
  })

  table.innerHTML = table_html;
  document.body.appendChild(table);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容