access 刪除字串中的字元_統計字串中每個字元出現的次數
技術標籤:access 刪除字串中的字元angularjs 元素重複指定次數c 陣列轉字串c++ _int64轉字串c++ 字串中的字元無效c++刪除字串中的指定字元
今天是js基礎的最後一天。晚自習做的測試。
關於這次測試感覺蠻可惜的,至少錯一道題,多則四五道。
這一道題選擇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中新增計時器。
使用這種方法我們不用將字串變成陣列,因為我們只需要遍歷字串即可,不需要做任何修改。而字串是可以通過‘索性’遍歷的。
為了安慰同桌小姐姐說這個方法不太重要,實際上自己都覺得有點些違心。不過沒關係,我們才學到基礎。API也是基礎。學到高階再理解這幾行程式碼應該就so easy了。
補充一點:
如果我們可以想到這種思路,那對於這種方法我們可以將其簡寫成:
for (var i = 0, l = str.length; i < l; i++) { obj[str[i]] = (obj[str[i]] + 1) || 1;}
沒錯就是短路運算(第一篇筆記中也有寫過)。
最後的廢話。
又一次分別,這次是博哥。物是人非事事休,欲語淚先流。
明天是老狗,狗哥,MC HotDog,我是差不多先生~
API,DOM真的很重要!
這次也許真的會掉頭髮!