1. 程式人生 > 其它 >access 刪除字串中的字元_統計字串中每個字元出現的次數

access 刪除字串中的字元_統計字串中每個字元出現的次數

技術標籤:access 刪除字串中的字元angularjs 元素重複指定次數c 陣列轉字串c++ _int64轉字串c++ 字串中的字元無效c++刪除字串中的指定字元

今天是js基礎的最後一天。晚自習做的測試。

關於這次測試感覺蠻可惜的,至少錯一道題,多則四五道。

65e52377cdf22b1fa2e8b9d90c86415d.png

這一道題選擇C,因為C是顯性型別轉換。

其餘選項,

A、字串拼接—Number轉字串。

B、字串轉Number。

D、任意型別轉換成布林型

其他的題今天不說,如果真的有錯的我會無能狂怒一會兒。


今天的主角是一道大題,不說有多難,但是很巧妙。

題目如下:

統計字串'abcoefoxyozzopp'中每個字元出現的次數。

先說我寫的方法:

 var str = 'abcoefoxyozzopp';    var arr = [];varnum=0;// 計數器// 將字串轉換成陣列for(vari=0;i        arr[i] = str.charAt(i);}//陣列排序arr.sort();//見後文 for(vari=0;iif(arr[i]!=arr[i+1]){document.write(arr[i]+":"+++num+"個"+"
");num=0; }else{num++; }}

首先我要說這並不是一個很聰明的辦法。不過,用的知識點相對較少,邏輯方面也比較好理解。

先來說一下思路:

1、將字串排序,排序方法用的是轉換成陣列,然後用陣列的內建排序方法Array.sort();

2、排序過後重複的程式碼就會‘扎堆’出現在一起,這是我們只需要對比前後兩個字元是否相同,如果相同就讓計數器加1,如果不同就返回計數器的數。(可以參考一下斐波那契函式的思考方式)

轉換陣列我用了一個相對愚蠢的方法——字串指定‘索引’獲取值+for迴圈。相比較有一個更好的方法是使用字串自帶的轉陣列方法:String.split()。

注意:這裡的引數寫空字串“”,否則會返回一個整體。

之後的程式碼就很好理解了,但是仍然要提示一點的是,計數器num是一個全域性變數。因為每一次for迴圈都可能改變計數器的值,所以在計算完一個字元並輸出之後一定要記著將計數器歸零。


還有一個很不錯的想法,同樣是比較好理解的。

var str = 'abcoefoxyozzopp';//迴圈的套出每個字元出現的次數 str會慢慢的變短直到為空while (str != "") {  //字串轉陣列  var arr = str.split("");  var num = 0;  //求第一個字元出現的次數  for (var i = 0; i < arr.length; i++) {     if (arr[0] == arr[i]) {         num++;     }   }   //在字串中刪掉跟第一個字元一樣的所有字元varre=arr[0];   str = str.replace(re, "");   document.write(arr[0] + ":" + num + "個" + "
");}

這一方法的難度是在於想到這一方法。一旦有了思路程式碼就脫口而出了。

思路:

我們只需要專心統計每一個值,統計完之後刪除即可。最後我們會把所有的字元全部刪掉,當字串為空時結束迴圈。

需要說明一下,刪除陣列元素的方法有很多,我選擇了一個相對比較簡單的——陣列元素替換(String.replace(x,y);).其他方式都可以,今天也學了很多,自己可以玩一玩,不一一舉例了。

如果發現這一步很難進行下去可以選擇性的放棄。不過有w3cschool,菜鳥教程,MDN,我相信問題應該不大。


最後一個也是我想著重說的一個,需要一定的程式設計思想,不過這個‘一定’也只是一丟丟。

varstr='abcoefoxyozzopp';var obj = {};var i = 0;for (i = 0; i < str.length; i++) {  key = str[i];  if (obj[key]) {   //物件中有這個字母 obj[key]++;}else{     //物件中沒有這個字母,把字母加到物件中      obj[key] = 1;}}//遍歷這個物件for(varkeyinobj){  document.write(key + ":" + obj[key] + "個" + "
");}

使用這個方法是最"標準"的,通過鍵值對的方式輸出字串中出現的字元和字元的個數。

我們把鍵當做字元,value當做計數器。

值得注意的有兩點:

1、宣告變數的時候不要賦值undefined。第一篇關於JS的筆記就說了,undefined有自身的含義,所以永遠不要顯性將物件設定為undefined

2、第一步判斷 if (obj[key]) {},如果obj[key]沒有初始化的話,值為undefined,undefined轉換為布林型是flase,此時向value中新增計時器。

使用這種方法我們不用將字串變成陣列,因為我們只需要遍歷字串即可,不需要做任何修改。而字串是可以通過‘索性’遍歷的。

為了安慰同桌小姐姐說這個方法不太重要,實際上自己都覺得有點些違心e6e4272d58a90403a6270dc16ec33e12.png。不過沒關係,我們才學到基礎。API也是基礎。學到高階再理解這幾行程式碼應該就so easy了b5aa885f755b98875b10e5c6c49fa850.png

補充一點:

如果我們可以想到這種思路,那對於這種方法我們可以將其簡寫成:

for (var i = 0, l = str.length; i < l; i++) {  obj[str[i]] = (obj[str[i]] + 1) || 1;}

沒錯就是短路運算(第一篇筆記中也有寫過)。


最後的廢話。

又一次分別,這次是博哥。物是人非事事休,欲語淚先流。

明天是老狗,狗哥,MC HotDog,我是差不多先生~

API,DOM真的很重要!

這次也許真的會掉頭髮!