亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從字符串中刪除相鄰的重復項

從字符串中刪除相鄰的重復項

絕地無雙 2023-09-06 15:46:20
我需要編寫一個函數來接收字符串并刪除相鄰的重復項。示例:輸入 -> “aabbaabbcccaaa”輸出 -> “ababca”我嘗試按如下方式解決:public String remdups(String input) {    String response = "";    char temp;    int i, length = input.length();    for(i = 0; i < length; i++) {        temp = input.charAt(i);        response += temp;        while(i < length && input.charAt(i) == temp) i++;    }    return response;}但時間復雜度似乎沒有達到預期,我該如何提高性能或者有什么更好的方法?我知道這是一個非常簡單的問題,但我找不到改進的方法或其他方法來做到這一點。
查看完整描述

2 回答

?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

對我來說,從復雜性的角度來看,您的代碼看起來已經很好了。它只遍歷字符串一次。您可以對響應進行優化,String使用 a StringBuilder,并且可能為了可讀性而稍微簡化循環(不需要 2 個嵌套循環,并且i從 2 個位置遞增計數器可能會引入錯誤)。


public String remdups(String input) {

  StringBuilder response = new StringBuilder(input.length());

  char temp;


  for (int i = 0; i < input.length(); i++) {

     char next = input.charAt(i);

     if (temp != next) {

       temp = next;

       response.append(temp);

     }

  }


  return response.toString();

}


查看完整回答
反對 回復 2023-09-06
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

為什么不嘗試使用正則表達式呢?就像這樣:

public static void main(String[] args) {
    String str = "aabbaabbcccaaa";
    System.out.println(str.replaceAll("(.)\\1+","$1"));
}

輸出:

ababca

編輯:
為了將來的參考,這種方法被證明是非常慢的。我使用 JMH 對它進行了基準測試,對于短字符串,它比非正則表達式解決方案慢大約 4 倍,并且對于較長(約 10k 個字符)的字符串只會變得更糟。


查看完整回答
反對 回復 2023-09-06
  • 2 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號