日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[leedcode][409][java]

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [leedcode][409][java] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

####【題目描述】

給定一個包含大寫字母和小寫字母的字符串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如 "Aa" 不能當做一個回文字符串。注意: 假設字符串的長度不會超過 1010。示例 1:輸入: "abccccdd"輸出: 7

解釋:
我們可以構造的最長的回文串是"dccaccd", 它的長度是 7。

貪心

class Solution {public int longestPalindrome(String s) {int[] count = new int[128];for (char c: s.toCharArray())count[c]++;int ans = 0;for (int v: count) {ans += v / 2 * 2;if (v % 2 == 1 && ans % 2 == 0)ans++;}return ans;} }
int數組實現
class Solution {public int longestPalindrome(String s) {int[] cnt = new int[58];for (char c : s.toCharArray()) {cnt[c - 'A'] += 1;}int ans = 0;for (int x: cnt) {// 字符出現的次數最多用偶數次。 //如果 x 是奇數,x & 1 的結果就是1,偶數就是0,實現了偶數不變、奇數減1的邏輯 // (x >> 1) << 1 ,先右移一位去掉最末位的0或1,再左移一位,也實現了偶數不變、奇數減1的邏輯。ans += x - (x & 1);}// 如果最終的長度小于原字符串的長度,說明里面某個字符出現了奇數次,那么那個字符可以放在回文串的中間,所以額外再加一。return ans < s.length() ? ans + 1 : ans; } }
Java8的流式風格
class Solution {public int longestPalindrome(String s) { //s.chars()的返回值是一個 IntStream,就是Int的流;.boxed()會裝箱返回Stream<Integer>;.collect()是聚合的算子,Collectors.toMap的三個參數分別是 keyMapper,valueMapper 和 mergeFunction。分別表示聚合出來的 Map 的 key 是什么,value 是什么,如果遇到key相同的,怎么合并值。 //Map<Integer, Integer> count = s.chars().boxed().collect(Collectors.toMap(k -> k, v -> 1, Integer::sum)); // counter.values() 返回的是map值的集合Collection<Integer>,先用.stream()轉成流以后,利用mapToInt 轉成 IntStream,因為 IntStream 是支持 sum 算子的,通過sum算子進行求和。int ans = count.values().stream().mapToInt(i -> i - (i & 1)).sum();return ans < s.length() ? ans + 1 : ans;} }
Hashmap
class Solution {public int longestPalindrome(String s) {if (s == null) return 0;Map<Character, Integer> map = new HashMap<>();for (int i = 0; i < s.length(); i++){if (map.containsKey(s.charAt(i))){map.replace(s.charAt(i), map.get(s.charAt(i)) + 1);} else {map.put(s.charAt(i), 1);}}int result = 0;for (Map.Entry<Character, Integer> entry : map.entrySet()){if (entry.getValue() % 2 == 0) {result += entry.getValue();} else {result += entry.getValue() - 1;}}if (result < s.length()) result++;return result;} }

####【總結】

  • 取模運算轉化(正數)
    • 取模是一個消耗較大的操作,因此大多數語言的編譯器比如C++都對模運算進行了優化
    • Java中是不存在無符號整型的,數字是用補碼來表示的(最高位是符號位,0表示正數,1表示負數)
    //正數能優化 負數不能優化 int a = -3 % 2; // -1 int b = -3 & 1; // 1 x = 87; x % 2 = x & (2 - 1) = 1010111 & 1 = 1 = 1; x % 4 = x & (4 - 1) = 1010111 & 11 = 11 = 3; x % 8 = x & (8 - 1) = 1010111 & 111 = 111 = 7; x % 16 = x & (16 - 1) = 1010111 & 1111 = 111 = 7; x % 32 = x & (32 - 1) = 1010111 & 11111 = 10111 = 2
  • 一題多解,多思考,不要總想遍歷,否則很難進步
  • 資料參考整理來自:https://mp.weixin.qq.com/s/HtDYSfaikwHozUrksU0A1w

    總結

    以上是生活随笔為你收集整理的[leedcode][409][java]的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。