標籤:img 預設 blog 計算 append 結束 另一個 注意 har
今天在簡書上看到這樣一道有趣的演算法題:
解題思路
首先定義一個變數element
,預設是字串的第一個字元。以element
為基準元素,去判斷某個字元是否重複。然後再去定義一個變數count
去記錄重複的次數,初始值應該為1
。
然後我們去遍曆整個字串,應該從第1
號位置的字元開始遍曆。如果當前字元等於element
,就說明該字元在當前字串中出現過,已經重複了。那麼count
就應該自增。
如果當前字元不等於element
,就說明上一個字元連續的重複次數已經計算完畢,可以進行拼接操作。接下來我們就可以操作當前字元了,count
還原到初始值1。
遍曆結束時,進行拼接操作。為什麼不在第二步進行拼接操作? 因為當前字元在整個字串中重複的次數還沒有統計完,如果記錄一次重複的次數,就進行拼接的操作的話,肯定不能達到預期效果。假如字串是“ppppp”
,如果這樣做了,輸出結果會是"p2p3p4p5"
。所以必須要統計完某一個字元的重複次數,才能進行拼接操作。我們只需要計算一個字元連續的重複次數。當我們遍曆某一個字元時,發現它不等於element
,就說明它上一個字元重複次數已經統計好,這時候我們才可以進行拼接字串操作。
應該注意的問題
先一般,後特殊。進行邊界控制,我們要去判斷字串是否為null
或者“”
,然後去做相應的判斷。
每次必須在前推進迴圈不變式中涉及到的變數值。
比如一個字元a
在該字串中出現過1
次,那麼應該輸出a
,而不是a1
。
不要使用字串拼接的形式拼接資料,String
是不可變對象,每次拼接會產生新的String
對象。使用StringBuffer
是安全執行緒的,還是可變對象。每次調用append()
並不會產生一個新的字串。
代碼實現:
public class Demo { public static void main(String[] args) { encode("wwwbbawabbb"); encode("a"); encode("abcabcccc"); encode("ppppprrrrppp"); encode(""); encode(null); } public static void encode(String str) { if (str == null || str.equals("")) { System.out.println(""); return; } // 利用StringBuffer變數字串接受結果 StringBuffer sb = new StringBuffer(); char element = str.charAt(0); int count=1; for(int i=1;i<str.length();i++) { if(element==str.charAt(i)) { count++; }else { //當讀到另一個不一樣的字元的時候,再拼接之前統計的字元 sb.append(element); //如果統計數量為1的時候不輸出統計數量 sb.append(count==1 ? "" :count); element = str.charAt(i); count=1; } } // 保證當最後一個字元和統計的數量都拼接上 sb.append(element); sb.append(count==1 ? "" :count); // 輸出整個結果 System.out.println(sb.toString()); }}
原文地址:https://www.jianshu.com/p/32756f1ea4e7
使用java語言,將字串中連續重複出現的字母變成“出現次數“+字母的格式