出現(xiàn)最多的字符串

這是用String本身的方法實現(xiàn)(es6的新增方法不太熟悉筷狼,基本上es5的);

  1. 使用String的match方法
  • 用正則匹配返回是的匹配到的字符串的數(shù)組
  • 用string匹配鳞芙,則返回一個類似 ["a", index: 2, input: "dfas"]
  • 沒有匹配觉既,則返回null
function getMostChar(str) {
  //出現(xiàn)的字符
  var most_char = '';
  var char = '';
  var char_arr = [];

  //出現(xiàn)的次數(shù)
  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, ';出現(xiàn)最多次數(shù)的字符:' + most_char, '事秀;出現(xiàn)的次數(shù)的數(shù)組:' + count_arr, '灾梦;出現(xiàn)最多次數(shù):' + most_count);
}
  1. indexOf 和 do{}while()
  • indexOf() 返回字符出現(xiàn)的第一次的位置,沒有匹配則返回-1
  • idnexOf(str,startpos) 的有兩個參數(shù)
    • str 匹配的字符
    • startpos {type number} 設(shè)置從字符串的開始匹配位置(包含這個startpos)
  • do{}while() 錯誤的也得執(zhí)行一次
function getMostChar(str) {
  //出現(xiàn)的字符
  var most_char = '';
  var char = '';
  var char_arr = [];

  //出現(xiàn)的次數(shù)
  var most_count = 0;
  var count = 0;
  var count_arr = [];

  //字符串出現(xiàn)的位置
  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;
        // 已經(jīng)檢測過不在檢測槐雾,對pos設(shè)置為當前位置
        pos = i+1;
      }
    })()
  } else {
    char_arr.push(str);
    most_count = len;
    most_char = str;
  }
  console.log('pos: ' + pos, '夭委;擁有的字符的種類:' + char_arr, ';出現(xiàn)最多次數(shù)的字符:' + most_char, '募强;出現(xiàn)的次數(shù)的數(shù)組:' + count_arr, '株灸;出現(xiàn)最多次數(shù):' + most_count);
}

while 類似

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

  //出現(xiàn)的次數(shù)
  var most_count = 0;
  var count = 0;
  var count_arr = [];

  //字符串出現(xiàn)的位置
  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, '擎值;出現(xiàn)最多次數(shù)的字符:' + most_char, '慌烧;出現(xiàn)的次數(shù)的數(shù)組:' + count_arr, ';出現(xiàn)最多次數(shù):' + most_count);
}
  1. 用search 方法實現(xiàn)鸠儿,其實邏輯同indexOf是一樣的屹蚊。只不過要利用字符串的截取方法。
function getMostChar(str) {
  //出現(xiàn)的字符
  var most_char = '';
  var char = '';
  var char_arr = [];

  //出現(xiàn)的次數(shù)
  var most_count = 0;
  var count = 0;
  var count_arr = [];

  //字符串出現(xiàn)的位置
  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, '淑翼;出現(xiàn)最多次數(shù)的字符:' + most_char, ';出現(xiàn)的次數(shù)的數(shù)組:' + count_arr, '品追;出現(xiàn)最多次數(shù):' + most_count);
}
  1. replace ,這是最最簡單的,最好理解冯丙。
function getMostChar(str) {
  //出現(xiàn)的字符
  var most_char = '';
  var char_arr = [];

  //出現(xiàn)的次數(shù)
  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, '肉瓦;出現(xiàn)最多次數(shù)的字符:' + most_char, ';出現(xiàn)的次數(shù)的數(shù)組:' + count_arr, '胃惜;出現(xiàn)最多次數(shù):' + most_count);
}
  1. split 這個方法使用起來實際上是把字符串變成數(shù)組泞莉,那就不是String方法。所以沒做下去船殉。

這個有什么好玩性了鲫趁,可以檢測作者是怎么用詞,檢測他用詞利虫。

例如挨厚,我找汪曾祺的《異秉》,測試:

var str = '小說的內(nèi)容';

getMostCharSort(str);

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

  //出現(xiàn)的字符
  var char = str[0];
  var most_char = '';
  var char_arr = [];

  //出現(xiàn)的次數(shù)
  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('出現(xiàn)最多次數(shù)的字符:' + most_char);
  console.log('出現(xiàn)的次數(shù)的數(shù)組:' + count_arr, );
  console.log('出現(xiàn)最多次數(shù):' + most_count);

  des(kv_arr)

  show(kv_arr);
}

function show(arr) {
  var table = document.createElement('table');
  var table_html = '<tr><td>字符</td><td>次數(shù)</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 = [];

  //出現(xiàn)的字符
  var char = str[0];

  //出現(xiàn)的次數(shù)
  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>次數(shù)</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);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末役电,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子棉胀,更是在濱河造成了極大的恐慌法瑟,老刑警劉巖癞志,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揖闸,死亡現(xiàn)場離奇詭異,居然都是意外死亡审残,警方通過查閱死者的電腦和手機麻掸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門酥夭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脊奋,你說我怎么就攤上這事熬北。” “怎么了诚隙?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵讶隐,是天一觀的道長。 經(jīng)常有香客問我久又,道長巫延,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任地消,我火速辦了婚禮炉峰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脉执。我一直安慰自己疼阔,他們只是感情好,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布半夷。 她就那樣靜靜地躺著婆廊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玻熙。 梳的紋絲不亂的頭發(fā)上否彩,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音嗦随,去河邊找鬼列荔。 笑死敬尺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的贴浙。 我是一名探鬼主播砂吞,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼崎溃!你這毒婦竟也來了蜻直?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤袁串,失蹤者是張志新(化名)和其女友劉穎概而,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囱修,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡赎瑰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了破镰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片餐曼。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鲜漩,靈堂內(nèi)的尸體忽然破棺而出源譬,到底是詐尸還是另有隱情,我是刑警寧澤孕似,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布踩娘,位于F島的核電站,受9級特大地震影響鳞青,放射性物質(zhì)發(fā)生泄漏霸饲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一臂拓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧习寸,春花似錦胶惰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸯匹,卻和暖如春坊饶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殴蓬。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工匿级, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蟋滴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓痘绎,卻偏偏與公主長得像津函,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子孤页,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Javascript有很多字符串的方法尔苦,有的人有W3C的API,還可以去MDN上去找行施,但是我覺得API上說的不全允坚,...
    頑皮的雪狐七七閱讀 2,160評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法蛾号,內(nèi)部類的語法稠项,繼承相關(guān)的語法,異常的語法须教,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 在挖掘分析的過程當中對字符串的處理是極為重要的皿渗,且出現(xiàn)也較為頻繁,R語言作為當前最為流行的開源數(shù)據(jù)分析和可視化平臺...
    果果哥哥BBQ閱讀 5,821評論 0 8
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,237評論 0 4
  • 我想我可以見到你吧! 嗯,贬养,挤土,不知道,也想不到误算,只是無數(shù)次想象遇見你時仰美,會不會是這樣子,符合你的標準: ...
    豆丁豆炒豆閱讀 453評論 2 6