【leetcode題解】貪心算法

目錄

?貪心算法?

檸檬水找零

將數組和減半的最少操作次數

最大數

擺動序列

最長遞增子序列

遞增的三元子序列

最長連續遞增序列

買賣股票的最佳時機

買賣股票的最佳時機 II

K 次取反后最大化的數組和

按身高排序

優勢洗牌

最長回文串

增減字符串匹配

分發餅干

最優除法

跳躍游戲 II

跳躍游戲

加油站

單調遞增的數字

壞了的計算器

【區間問題】:

合并區間

無重疊區間

用最少數量的箭引爆氣球

整數替換

俄羅斯套娃信封問題

可被三整除的最大和

距離相等的條形碼

重構字符串


?貪心算法?

貪心算法

策略極多。

貪心策略:局部最優->全局最優

1. 把解決問題的過程分為若干個部分

2. 解決每一步的時候,都選擇當前看起來最優的解法

3. “希望”得到全局最優

貪心算法的特點

1. 貪心策略的提出是沒有標準以及模板的

2. 可能每一道題的貪心策略都是不同的

有的時候,貪心策略是一個錯誤的方法。正確的貪心策略,我們是需要“證明的

學習方法

1. 前期學習的時候,把重點放在貪心的策略上,把這個策略當成經驗吸收

2. 如何去證明

檸檬水找零

860. 檸檬水找零 - 力扣(LeetCode)

解法:貪心 分情況討論:

5->收下;

10->找5,收10;

20->找10+5或者5+5+5

class Solution {public boolean lemonadeChange(int[] bills) {int five = 0, ten = 0;// 統計5、10的數量for (int x : bills) {if (x == 5)five++;// 不用找錢else if (x == 10) {ten++;if (five < 1)return false;elsefive--;} else {// 付20if (ten >= 1 && five >= 1) {ten--;five--;} else if (five >= 3) {five -= 3;} else {return false;}}}return true;}
}
將數組和減半的最少操作次數

2208. 將數組和減半的最少操作次數 - 力扣(LeetCode)

解法:貪心+大根堆

具體策略:每次挑選當前數組中最大的那個數,然后減半,知道數組和減少到至少一半為止

class Solution {public int halveArray(int[] nums) {PriorityQueue<Double> heap = new PriorityQueue<>((a, b) -> b.compareTo(a));// 大根堆-后比前double sum = 0.0;for (int x : nums) {heap.offer((double) x);// 強轉sum += x;}sum /= 2.0;int count = 0;while (sum > 0) {double t = heap.poll() / 2.0;heap.offer(t);sum -= t;count++;}return count;}
}
最大數

179. 最大數 - 力扣(LeetCode)

解法:

正常的排序本質(升序):確定元素的先后順序,誰在前,誰在后

排序規則:

a>b? ->? a前,b后

a=b? ->? 無所謂

a<b? ->? b前,a后

本題的排序(優化):把數轉化成字符串,然后拼接字符串,比較字典序

排序規則:

ab>ba? ->? a前,b后

ab=ba? ->? 無所謂

ab<ba? ->? b前,a后

class Solution {public String largestNumber(int[] nums) {int n = nums.length;String[] s = new String[n];for (int i = 0; i < n; i++) {s[i] = "" + nums[i];// 將整數數組轉為字符串數組}Arrays.sort(s, (a, b) -> {// 重寫排序return (b + a).compareTo(a + b);// 返回最大數});StringBuffer ret = new StringBuffer();for (String ss : s) {ret.append(ss);// 對字符串數組中元素進行拼接(最大數)}if (ret.charAt(0) == '0')return "0";return ret.toString();}
}
擺動序列

376. 擺動序列 - 力扣(LeetCode)

解法:貪心

估計出所有的波峰以及波谷的個數(左右兩邊相減后符號不同)

核心思路:

right=nums[ i+1 ]-nums[ i ]

if(right==0) continue;

if(left*right<=0) ret++;

left=right;

class Solution {public int wiggleMaxLength(int[] nums) {int n = nums.length, ret = 0, left = 0;if (n < 2)return 1;for (int i = 0; i < n - 1; i++) {int right = nums[i + 1] - nums[i];if (right == 0)continue;if (left * right <= 0) {ret++;left = right;}}return ret + 1;}
}
?最長遞增子序列

300. 最長遞增子序列 - 力扣(LeetCode)

解法:動態規劃+二分(優化)

1. dp解法:

  1. 狀態表示:dp[i]表示,以i位置的元素為結尾的所有子序列中,最長遞增子序列的長度
  2. 狀態轉移方程:dp[i]=max(dp[j]+1)(j<i&&nums[j]<nums[i])

在考慮最長遞增子序列的“長度”的時候,不需要關心這個序列是什么樣子,僅需關心“最后一個元素”是誰。

2. 貪心優化:

  1. 存什么:所有長度為x的遞增子序列中,最后一個元素的最小值
  2. 存哪里:所有大于等于nums[i]的最小值的位置

3. 利用二分優化

class Solution {public int lengthOfLIS(int[] nums) {ArrayList<Integer> ret = new ArrayList<>();int n = nums.length;ret.add(nums[0]);// 先把nums中第一個數放進去for (int i = 0; i < n; i++) {if (nums[i] > ret.get(ret.size() - 1)) {// 下一個數>ret中最后一個數ret.add(nums[i]);} else {// <=最后一個數// 二分插入位置int left = 0, right = ret.size() - 1;while (left < right) {int mid = (left + right) / 2;if (ret.get(mid) < nums[i])left = mid + 1;elseright = mid;}ret.set(left, nums[i]);}}return ret.size();}
}
遞增的三元子序列

334. 遞增的三元子序列 - 力扣(LeetCode)

解法一:動態規劃 - 利用dp找到數組中最長遞增子序列的長度,判斷是否大于等于3即可

解法二:貪心 - >O(n)

class Solution {public boolean increasingTriplet(int[] nums) {ArrayList<Integer> ret = new ArrayList<>();ret.add(nums[0]);int n = nums.length;for (int i = 1; i < n; i++) {if (nums[i] > ret.get(ret.size() - 1)) {ret.add(nums[i]);} else {int left = 0, right = ret.size() - 1;while (left < right) {int mid = (left + right) / 2;if (ret.get(mid) < nums[i])left = mid + 1;elseright = mid;}ret.set(left, nums[i]);}}return ret.size() >= 3 ? true : false;}
}

優化:

class Solution {public boolean increasingTriplet(int[] nums) {int a = nums[0], b = Integer.MAX_VALUE;int n = nums.length;for (int i = 1; i < n; i++) {if (nums[i] > b)return true;else if (nums[i] > a)b = nums[i];elsea = nums[i];}return false;}
}
最長連續遞增序列

674. 最長連續遞增序列 - 力扣(LeetCode)

解法:貪心+雙指針

class Solution {public int findLengthOfLCIS(int[] nums) {int ret = 0, n = nums.length;for (int i = 0; i < n;) {int j = i + 1;while (j < n && nums[j] > nums[j - 1])j++;ret = Math.max(ret, j - i);i = j;// 循環內部直接更新下一個位置的起點 - 貪心}return ret;}
}
買賣股票的最佳時機

121. 買賣股票的最佳時機 - 力扣(LeetCode)

解法一:暴力解法,兩層for循環的暴力枚舉? ? ? ? ? ? ? ? ? ? O(n^{2})

解法二:貪心 + 一個變量標記“前綴最小值”prevMin? ? ? ? O(n)

class Solution {public int maxProfit(int[] prices) {int ret = 0, prevmin = Integer.MAX_VALUE;for (int i = 0; i < prices.length; i++) {ret = Math.max(ret, prices[i] - prevmin);// 更新結果prevmin = Math.min(prevmin, prices[i]);// 更新最小值}return ret;}
}
買賣股票的最佳時機 II

122. 買賣股票的最佳時機 II - 力扣(LeetCode)

解法:貪心——>只要能獲得正收益,就進行交易

實現方式一:雙指針????????

class Solution {public int maxProfit(int[] prices) {// 實現方式一:雙指針int ret = 0, n = prices.length;for (int i = 0; i < n; i++) {int j = i;while (j + 1 < n && prices[j] < prices[j + 1])j++;// 向后尋找上升的末端ret += prices[j] - prices[i];i = j;}return ret;}
}

實現方式二:拆分交易,把一段交易拆分成一天一天

class Solution {public int maxProfit(int[] prices) {// 實現方式二:拆分成一天一天的形式int ret = 0;for (int i = 1; i < prices.length; i++) {if (prices[i] > prices[i - 1]) {ret += prices[i] - prices[i - 1];}}return ret;}
}
K 次取反后最大化的數組和

1005. K 次取反后最大化的數組和 - 力扣(LeetCode)

解法一:每次排序后,一直將最小數取反

class Solution {public int largestSumAfterKNegations(int[] nums, int k) {int x = 0;while (x < k) {Arrays.sort(nums);nums[0] = (-nums[0]);x++;}int sum = 0;for (int i = 0; i < nums.length; i++) {sum += nums[i];}return sum;}
}

解法二:貪心——>分情況討論:

按身高排序

2418. 按身高排序 - 力扣(LeetCode)

解法一:創建二元組

  1. 創建一個新的數組 pair<int,string>;
  2. 對新的數組排序;
  3. 按照順序把名字提取出來即可;

解法二:利用哈希表存下映射關系(缺陷:身高相同時比較麻煩)

  1. 先用哈希表存下映射關系:<身高,名字>;
  2. 對身高數組排序;
  3. 根據排序后的結果,往哈希表里面找名字即可;

解法三:對下標排序(常用)

  1. 創建一個下標數組;
  2. 僅對下標數組排序;
  3. 根據下標數組排序后的結果,找到原數組的信息

class Solution {public String[] sortPeople(String[] names, int[] heights) {// 創建一個下標數組int n = names.length;Integer[] index = new Integer[n];for (int i = 0; i < n; i++)index[i] = i; // index={0,1,2,3,4,···};// 對下標數組排序Arrays.sort(index, (i, j) -> {return heights[j] - heights[i];});// 提取結果String[] ret = new String[n];for (int i = 0; i < n; i++) {ret[i] = names[index[i]];}return ret;}
}
優勢洗牌

870. 優勢洗牌 - 力扣(LeetCode)

解法:田忌賽馬-廢物利用最大化

排序:

  1. 如果比不過,就去拖累對方最強的那個
  2. 如果能比過,就直接比
class Solution {public int[] advantageCount(int[] nums1, int[] nums2) {int n = nums1.length;// 1. 排序Arrays.sort(nums1);Integer[] index2 = new Integer[n];for (int i = 0; i < n; i++)index2[i] = i;Arrays.sort(index2, (i, j) -> {return nums2[i] - nums2[j];});// 2. 田忌賽馬int[] ret = new int[n];int left = 0, right = n - 1;for (int x : nums1) {if (x > nums2[index2[left]])ret[index2[left++]] = x;elseret[index2[right--]] = x;// 廢物利用最大化}return ret;}
}
最長回文串

409. 最長回文串 - 力扣(LeetCode)

class Solution {public int longestPalindrome(String s) {// 1. 計數 - 用數組模擬哈希表int[] count = new int[128]; // 覆蓋所有ASCII字符for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);count[c]++;}// 2. 統計結果int sum = 0;boolean hasOdd = false;for (int c : count) {sum += c / 2 * 2; // 取最大偶數次if (c % 2 != 0) {hasOdd = true;}}return hasOdd ? sum + 1 : sum;}
}
增減字符串匹配

942. 增減字符串匹配 - 力扣(LeetCode)

解法:貪心

  1. 當遇到“ I ”:選擇當前最小的那個數
  2. 當遇到“ D?”:選擇當前最大的那個數
class Solution {public int[] diStringMatch(String s) {int n = s.length();int[] ret = new int[n + 1];int left = 0, right = n, i = 0;while (left < right) {if (s.charAt(i) == 'I') {ret[i++] = left++;} else {ret[i++] = right--;}}ret[n] = left; // 把最后一個數放進去return ret;}
}
分發餅干

455. 分發餅干 - 力扣(LeetCode)

解法:貪心策略:

排序,針對當前胃口最小的孩子,挑選餅干:

  1. 能滿足,直接喂
  2. 不能滿足,刪掉這個餅干
class Solution {public int findContentChildren(int[] g, int[] s) {int ret = 0, i = 0, j = 0;Arrays.sort(g);Arrays.sort(s);while (i < g.length && j < s.length) {if (g[i] <= s[j]) {ret++;i++;j++;} else {j++;}}return ret;}
}
最優除法

553. 最優除法 - 力扣(LeetCode)

解法一:暴力解法->遞歸->記憶化搜索->動態規劃(麻煩)

解法二:貪心

除了前兩個數以外,其余的數全放在分子上即可

class Solution {public String optimalDivision(int[] nums) {int n = nums.length;StringBuffer ret = new StringBuffer();if (n == 1) {return ret.append(nums[0]).toString();} else if (n == 2) {return ret.append(nums[0]).append("/").append(nums[1]).toString();} else {ret.append(nums[0]).append("/(");int i = 1;while (i < n - 1) {ret.append(nums[i++]).append("/");}ret.append(nums[n - 1]).append(")");}return ret.toString();}
}
跳躍游戲 II

45. 跳躍游戲 II - 力扣(LeetCode)

解法一:貪心(×)

解法二:動態規劃

dp[ i ]表示:從0位置開始,到達 i 位置時的最小跳躍次數

解法三:類似層序遍歷的過程

class Solution {public int jump(int[] nums) {int left = 0, right = 0, ret = 0, maxpos = 0, n = nums.length;while (left <= right) {if (maxpos >= n - 1)return ret;for (int i = left; i <= right; i++) {maxpos = Math.max(maxpos, nums[i] + i);}left = right + 1;right = maxpos;ret++;}return -1;}
}
跳躍游戲

55. 跳躍游戲 - 力扣(LeetCode)

解法同上

class Solution {public boolean canJump(int[] nums) {int left = 0, right = 0, maxpos = 0, n = nums.length;while (left <= right) {if (maxpos >= n - 1)return true;for (int i = left; i <= right; i++) {maxpos = Math.max(maxpos, nums[i] + i);}left = right + 1;right = maxpos;}return false;}
}
加油站

134. 加油站 - 力扣(LeetCode)

解法一:暴力枚舉(超時)O(n^{2})

凈收益:diff = [-2,-2,-2,3,3]

  1. 依次枚舉所有的起點
  2. 從起點開始,模擬一遍加油的流程即可

解法二:貪心 O(n)

class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int curgas = 0, tank = 0, n = gas.length, begin = 0;int[] diff = new int[n];for (int i = 0; i < n; i++) {curgas += gas[i] - cost[i];tank += gas[i] - cost[i];if (tank < 0) {begin = i + 1;tank = 0;}}return curgas >= 0 ? begin : -1;}
}
單調遞增的數字

738. 單調遞增的數字 - 力扣(LeetCode)

解法一:暴力枚舉

  1. 從大到小的順序,枚舉[n,0]區間內的數字
  2. 判斷數字是否是“單調遞增的”
    1. 數字->字符串
    2. 模10,除以10

解法二:貪心(找規律)

  1. 如果高位單增,則不修改
  2. 從左往右,找到第一個遞減的位置(從這個位置向前推,推到相同區域的最左端),使其減小1,后面的數全部修改為9
class Solution {public int monotoneIncreasingDigits(int n) {// 把數字轉化為字符數組char[] s = Integer.toString(n).toCharArray();int i = 0, m = s.length;// 找到第一個遞減的位置while (i + 1 < m && s[i] <= s[i + 1])i++;if (i == m - 1)return n;// 特殊情況// 回退while (i - 1 >= 0 && s[i] == s[i - 1])i--;s[i]--;for (int j = i + 1; j < m; j++)s[j] = '9';return Integer.parseInt(new String(s));// 將字符數組轉化為整型}
}
壞了的計算器

991. 壞了的計算器 - 力扣(LeetCode)

解法一:正向推導(難)

解法二:正難則反

class Solution {public int brokenCalc(int start, int target) {// 正難則反+貪心int ret = 0;while (target > start) {if (target % 2 == 0)target /= 2;elsetarget += 1;ret++;}return ret + start - target;}
}
【區間問題】
  1. 排序——按照左端點或右端點
  2. 根據排序后結果總結規律,進而得出解決問題的策略
合并區間

56. 合并區間 - 力扣(LeetCode)

解法:排序(左端點)+貪心策略

  1. 先按照左端點排序——性質:能夠合并的區間都是連續的-只需遍歷數組一次
  2. 如何合并——求并集
class Solution {public int[][] merge(int[][] intervals) {// 按照左端點排序Arrays.sort(intervals, (v1, v2) -> {return v1[0] - v2[0];});// 合并區間-求并集int left = intervals[0][0], right = intervals[0][1];List<int[]> ret = new ArrayList<>();for (int i = 1; i < intervals.length; i++) {int a = intervals[i][0], b = intervals[i][1];if (a <= right) {// 有重疊部分-合并right = Math.max(b, right);} else {// 不能合并ret.add(new int[] { left, right });// 把結果加入數組中left = a;right = b;}}// 最后一個區間ret.add(new int[] { left, right });return ret.toArray(new int[0][]);// 不限行不限列}
}
無重疊區間

435. 無重疊區間 - 力扣(LeetCode)

解法:排序(左端點)+貪心策略

  1. 按照左端點排序
  2. 移除區間(移除最少的區間,保留更多的區間)
class Solution {public int eraseOverlapIntervals(int[][] intervals) {// 按左端點進行排序Arrays.sort(intervals, (v1, v2) -> {return v1[0] - v2[0];});// 貪心int left = intervals[0][0], right = intervals[0][1];int count = 0;for (int i = 1; i < intervals.length; i++) {int a = intervals[i][0], b = intervals[i][1];if (a < right) {// 有重疊部分right = Math.min(b, right);count++;} else {// 沒有重疊部分left = a;right = b;}}return count;}
}
用最少數量的箭引爆氣球

452. 用最少數量的箭引爆氣球 - 力扣(LeetCode)

解法:排序(左端點)+貪心策略

  1. 按照左端點排序
    1. 性質:按照左端點排序之后,互相重疊的區間是連續的
  2. 提出貪心策略
    1. 最少的弓箭數量->一支箭應該引爆更多的氣球->將互相重疊的所有區間都拿出來引爆
class Solution {public int findMinArrowShots(int[][] points) {// 按左端點排序Arrays.sort(points, (v1, v2) ->// return v1[0] - v2[0];Integer.compare(v1[0], v2[0])// 防溢出);// 貪心int ret = 0;int left = points[0][0], right = points[0][1];for (int i = 1; i < points.length; i++) {int a = points[i][0], b = points[i][1];if (a <= right) {ret++;right = Math.min(b, right);} else {left = a;right = b;}}return points.length - ret;}
}
整數替換

397. 整數替換 - 力扣(LeetCode)

解法一:模擬 - 遞歸(暴力)

class Solution {public int integerReplacement(int n) {return dfs((long) n);}public int dfs(long n) {if (n == 1)return 0;if (n % 2 == 0)return 1 + dfs(n / 2);else {return 1 + Math.min(dfs(n + 1), dfs(n - 1));// 最小值}}
}

加上備忘錄(記憶化搜索):

class Solution {// 加上備忘錄Map<Long, Integer> hash;public int integerReplacement(int n) {hash = new HashMap<>();return dfs((long) n);}public int dfs(long n) {if (hash.containsKey(n))return hash.get(n);if (n == 1) {hash.put(n, 0);return hash.get(n);}if (n % 2 == 0) {hash.put(n, 1 + dfs(n / 2));return hash.get(n);} else {hash.put(n, 1 + Math.min(dfs(n + 1), dfs(n - 1)));// 最小值存入備忘錄return hash.get(n);}}
}

解法二:貪心+分類討論(不好想)

?補充:二進制

  1. 偶數:二進制表示中最后一位為0
  2. 奇數:二進制表示中最后一位為1
  3. ÷2操作:二進制表示中右移一位
class Solution {public int integerReplacement(int n) {int ret = 0;while (n > 1) {// 分類討論if (n % 2 == 0) {// 偶數n /= 2;ret++;} else {// 奇數if (n == 3) {ret += 2;// 需要兩步n = 1;// 將n置為1} else if (n % 4 == 1) {n = (n - 1) / 2;ret += 2;// 需要兩步} else {n = n / 2 + 1;// (同n=(n+1)/2);ret += 2;}}}return ret;}
}
俄羅斯套娃信封問題

354. 俄羅斯套娃信封問題 - 力扣(LeetCode)

解法一:常規解法->動態規劃+貪心+二分

亂序 -> 有序 -> 按照左端點排序 -> 最長遞增子序列

  1. 狀態表示??dp[i] 表示:以 i 位置的信封為結尾的所有套娃序列中,最長的套娃序列的長度
  2. 狀態轉移方程 dp[i]=max(dp[j]+1) -> 0<=j<i;e[ i ][ 0 ]>e[ j ][ 0 ];e[ i ][ 1 ]>e[ j ][ 1 ]
  3. 初始化
  4. 填表順序
  5. 返回值

解法二:重寫排序(左端點從小到大)+貪心+二分(找到規律)

重寫排序:-> 最長遞增子序列

  1. 左端點不同
    1. 左端點從小到大排序
  2. 左端點相同
    1. 右端點從大到小排序
class Solution {public int maxEnvelopes(int[][] e) {// 重寫排序Arrays.sort(e, (v1, v2) -> {return v1[0] != v2[0] ? v1[0] - v2[0] : v2[1] - v1[1];});// 貪心+二分ArrayList<Integer> ret = new ArrayList<>();ret.add(e[0][1]);for (int i = 1; i < e.length; i++) {int b = e[i][1];if (b > ret.get(ret.size() - 1))ret.add(b);else {int left = 0, right = ret.size() - 1;while (left < right) {int mid = (left + right) / 2;if (ret.get(ret.size() - 1) >= b)right = mid;elseleft = mid + 1;}ret.set(left, b);}}return ret.size();}
}
可被三整除的最大和

1262. 可被三整除的最大和 - 力扣(LeetCode)

解法:正難則反+貪心+分類討論

先把所有的數累加在一起->根據累加和,刪除一些數

class Solution {public int maxSumDivThree(int[] nums) {int INF = 0x3f3f3f3f;int sum = 0, x1 = INF, x2 = INF, y1 = INF, y2 = INF;for (int x : nums) {sum += x;// 找最小值和次小值if (x % 3 == 1) {if (x < x1) {x2 = x1;x1 = x;} else if (x < x2) {x2 = x;}} else if (x % 3 == 2) {if (x < y1) {y2 = y1;y1 = x;} else if (x < y2) {y2 = x;}}}// 分類討論if (sum % 3 == 0)return sum;else if (sum % 3 == 1)return Math.max(sum - x1, sum - y1 - y2);elsereturn Math.max(sum - y1, sum - x1 - x2);}
}

解法二:動態規劃

距離相等的條形碼

1054. 距離相等的條形碼 - 力扣(LeetCode)

解法:貪心+模擬+哈希表

每次處理一批相同的數,擺放的時候每次隔一個格子(先處理出現次數最多的數,剩下的數的處理順序無所謂

class Solution {public int[] rearrangeBarcodes(int[] b) {Map<Integer, Integer> hash = new HashMap<>();int maxval = 0, maxcount = 0;for (int x : b) {hash.put(x, hash.getOrDefault(x, 0) + 1);if (maxcount < hash.get(x)) {maxcount = hash.get(x);maxval = x;}}int n = b.length;int[] ret = new int[n];int index = 0;// 先處理出現次數最多的數for (int i = 0; i < maxcount; i++) {ret[index] = maxval;index += 2;}hash.remove(maxval);for (int x : hash.keySet()) {for (int i = 0; i < hash.get(x); i++) {if (index >= n)index = 1;ret[index] = x;index += 2;}}return ret;}
}
重構字符串

767. 重構字符串 - 力扣(LeetCode)

解法:貪心+模擬

  1. 每次處理一批相同的字符
  2. 擺放的時候,隔一個位置放一個字符
  3. 優先處理出現次數最多的字符
class Solution {public String reorganizeString(String s) {// 先統計個數int n = s.length();int[] hash = new int[26];int maxcount = 0;char maxchar = ' ';for (int i = 0; i < n; i++) {char ch = s.charAt(i);if (maxcount < ++hash[ch - 'a']) {maxchar = ch;maxcount = hash[ch - 'a'];}}int index = 0;char[] ret = new char[n];// 先判斷if (maxcount > (n + 1) / 2)return "";// 先處理出現次數最多的數for (int i = 0; i < maxcount; i++) {ret[index] = maxchar;index += 2;}hash[maxchar - 'a'] = 0;for (int i = 0; i < 26; i++) {for (int j = 0; j < hash[i]; j++) {if (index >= n)index = 1;ret[index] = (char) (i + 'a');index += 2;}}return new String(ret);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74376.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74376.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74376.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Langchain4J框架相關面試題

以下是關于Langchain4J框架的面試題目及答案 ### Langchain4J基礎概念類 1. **Langchain4J框架是什么&#xff1f;它的核心功能有哪些&#xff1f;** Langchain4J是一個用于構建語言模型應用的Java框架&#xff0c;它為開發者提供了一套簡潔高效的API&#xff0c;使得在Jav…

Apache Doris

Apache Doris介紹 Apache Doris 是一個基于 MPP 架構的高性能、實時的分析型數據庫&#xff0c;以極速易用的特點被人們所熟知&#xff0c;僅需亞秒級響應時間即可返回海量數據下的查詢結果&#xff0c;不僅可以支持高并發的點查詢場景&#xff0c;也能支持高吞吐的復雜分析場…

VLAN間通信

目錄 第一步&#xff1a;配vlan 第二步&#xff1a;配置核心vlanif,MAC地址信息。 第三步&#xff1a;ospf協議 三層交換機&#xff08;匯聚層&#xff09;: 對于交換機、路由器、防火墻等網絡設備而言&#xff0c;接口類型一般存在兩種&#xff1a;二層接口&#xff0c;三…

LeetCode熱題100精講——Top2:字母異位詞分組【哈希】

你好&#xff0c;我是安然無虞。 文章目錄 題目背景字母異位詞分組C解法Python解法 題目背景 如果大家對于 哈希 類型的概念并不熟悉, 可以先看我之前為此專門寫的算法詳解: 藍橋杯算法競賽系列第九章巧解哈希題&#xff0c;用這3種數據類型足矣 字母異位詞分組 題目鏈接&am…

基于python+django的圖書借閱網站-圖書借閱管理系統源碼+運行步驟

該系統是基于pythondjango開發的在線圖書借閱管理系統。系統適合場景&#xff1a;大學生、課程作業、系統設計、畢業設計。 演示地址 前臺地址&#xff1a; http://book.gitapp.cn 后臺地址&#xff1a;http://book.gitapp.cn/#/admin 后臺管理帳號&#xff1a; 用戶名&…

uni-app集成保利威直播、點播SDK經驗FQ(二)|小程序直播/APP直播開發適用

通過uniapp集成保利威直播、點播SDK來開發小程序/APP的視頻直播能力&#xff0c;在實際開發中可能會遇到的疑問和解決方案&#xff0c;下篇。更多疑問請咨詢19924784795。 1.ios不能后臺掛起uniapp插件 ios端使用后臺音頻播放和畫中畫功能&#xff0c;沒有在 manifest.json 進…

數據庫三級填空+應用題(1)

填空 35【答案】TOP 3 WITH TIES 【解析】希望選出商品數量最多的前3類商品&#xff0c;并獲得相應的商品類別和數量。with ties一般是和Top 、 order by相結合使用,表示包括與最后一行order by后面的參數取值并列的結果。 36在SQL Server 2008中&#xff0c;每個數據頁可存儲8…

前端(vue)學習筆記(CLASS 5):自定義指令插槽路由

1、自定義指令 內置指令&#xff1a;內部提供的&#xff0c;每個指令都有自己各自獨立的功能 自定義指令&#xff1a;自己定義的指令&#xff0c;可以封裝一些dom操作&#xff0c;擴展額外功能 全局注冊-語法 例如&#xff0c;當頁面加載時&#xff0c;讓元素獲得焦點 Vue.…

【redis】事務詳解,相關命令multi、exec、discard 與 watch 的原理

文章目錄 什么是事務原子性一致性持久性隔離性 優勢與 MySQL 對比用處 事務相關命令開啟事務——MULTI執行事務——EXEC放棄當前事務——DISCARD監控某個 key——WATCH作用場景使用方法實現原理 事務總結 什么是事務 MySQL 事務&#xff1a; 原子性&#xff1a;把多個操作&am…

【Java SE】單例設計模式

參考筆記&#xff1a;深入理解Java設計模式&#xff1a;單例模式及其餓漢式與懶漢式的對比,-CSDN博客 目錄 1.什么是設計模式 2.經典設計模式 3.單例設計模式&#xff08;static屬性/方法經典使用場景 &#xff09; 3.1 餓漢式單例模式 3.2 懶漢式單例模式 4.補充 1.什么…

【day2】數據結構刷題 棧

一 有效的括號 給定一個只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判斷字符串是否有效。 有效字符串需滿足&#xff1a; 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右括號都有一個對應的…

藍橋杯 勁舞團

問題描述 小藍最近迷上了一款名為 “勁舞團” 的游戲。 在游戲中&#xff0c;只要按照給出的鍵位提示依次按出對應的鍵位&#xff0c;游戲人物便可以跟隨節奏跳舞。 對于連續的 K 次正確敲擊&#xff0c;如果任意連續兩次敲擊之間的時間間隔都小于等于 1 秒&#xff08;即 1…

數據庫數值函數詳解

各類資料學習下載合集 ??https://pan.quark.cn/s/8c91ccb5a474?? 數值函數是數據庫中用于處理數值數據的函數,可以用于執行各種數學運算、統計計算等。數值函數在數據分析及處理時非常重要,能夠幫助我們進行數據的聚合、計算和轉換。在本篇博客中,我們將詳細介紹常用的…

關于金融開發領域的一些專業知識總結

目錄 1. 交易生命周期 1.1 證券交易所 1.1.1 交易前 1) 訂單生成&#xff08;Order Generation&#xff09; 2) 訂單管理&#xff08;Order Management&#xff09; 1.1.2 交易執行 3) 交易匹配&#xff08;Trade Matching&#xff09; 1.1.3 交易后 4) 交易確認&…

Leetcode 3495. Minimum Operations to Make Array Elements Zero

Leetcode 3495. Minimum Operations to Make Array Elements Zero 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3495. Minimum Operations to Make Array Elements Zero 1. 解題思路 這一題的話核心就是統計對任意自然數 n n n&#xff0c;從 1 1 1到 n n n當中所有的數字對…

Vue 3 + TypeScript 實現視頻播放與字幕功能:集成西瓜播放器 XGPlayer

文章目錄 1. 前言&#xff1a;視頻播放器的重要性2. 準備工作2.1 安裝 Vue 3 項目2.2 安裝 XGPlayer 和相關依賴 3. 實現視頻播放3.1 初始化 XGPlayer 4. 添加字幕功能4.1 配置字幕 4.2 字幕文件格式5. 增加交互性完整的代碼&#xff0c;僅供參考6. 總結 在現代 Web 開發中&…

MacOS安裝 nextcloud 的 Virtual File System

需求 在Mac上安裝next cloud實現類似 OneDrive 那樣&#xff0c;文件直接保存在服務器&#xff0c;需要再下載到本地。 方法 在 官網下載Download for desktop&#xff0c;注意要下對版本&#xff0c;千萬別下 Mac OS默認的那個。 安裝了登錄在配置過程中千萬不要設置任何同…

.NET 9 徹底改變了 API 文檔:從 Swashbuckle(Swagger) 到 Scalar

示例代碼下載&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90404652 摘要 API 文檔是現代軟件開發的支柱。隨著 .NET 9 從 Swashbuckle 轉向 Microsoft.AspNetCore.OpenApi&#xff0c;開發人員需要新的策略來保持高效。本文探討了這些變化&#xff0c;并介…

深入剖析Java虛擬機(JVM):從零開始掌握Java核心引擎

&#x1f4cc; 引言&#xff1a;為什么每個Java開發者都要懂JVM&#xff1f; 想象你是一名賽車手&#xff0c;Java是你的賽車&#xff0c;而JVM就是賽車的引擎。 雖然你可以不關心引擎內部構造就能開車&#xff0c;但要想在比賽中獲勝&#xff0c;必須了解引擎如何工作&#…

怎么連接linux服務器的桌面

一、使用 VNC&#xff08;Virtual Network Computing&#xff09; 1. 服務器端配置&#xff08;Ubuntu 22.04 示例&#xff09; # 安裝 VNC 服務器&#xff08;以 TigerVNC 為例&#xff09; sudo apt update sudo apt install tigervnc-standalone-server tigervnc-xorg-ext…