227. 基本計算器 II(不考慮括號)
阿新 • • 發佈:2022-02-22
題目描述:
給你一個 升序排列 的陣列 nums ,請你 原地 刪除重複出現的元素,使每個元素 只出現一次 ,返回刪除後陣列的新長度。元素的 相對順序 應該保持 一致 。
由於在某些語言中不能改變陣列的長度,所以必須將結果放在陣列nums的第一部分。更規範地說,如果在刪除重複項之後有 k 個元素,那麼nums的前 k 個元素應該儲存最終結果。
將最終結果插入nums 的前 k 個位置後返回 k 。
示例 1: 輸入:nums = [1,1,2] 輸出:2, nums = [1,2,_] 解釋:函式應該返回新的長度 2 ,並且原陣列 nums 的前兩個元素被修改為 1, 2 。不需要考慮陣列中超出新長度後面的元素。 示例 2: 輸入:nums = [0,0,1,1,1,2,2,3,3,4] 輸出:5, nums = [0,1,2,3,4] 解釋:函式應該返回新的長度 5 , 並且原陣列 nums 的前五個元素被修改為 0, 1, 2, 3, 4 。不需要考慮陣列中超出新長度後面的元素。 提示: 0 <= nums.length <= 3 * 104 -104 <= nums[i] <= 104 nums 已按 升序 排列
解題思路:
我們定義:區間 [0..j] (注意這裡是左閉右閉區間)沒有出現重複元素,此時變數 j 是上一輪找到的第 1 次出現的元素的下標。迴圈變數 i 看到的數值 nums[i] 永遠和變數 j 看到的數值 nums[j] 進行比較。 相等繼續迴圈,不相等就將nums[i]賦值給nums[++j]即可,最後返回 j+1即可
程式碼如下:
class Solution {
public int removeDuplicates(int[] nums) {
int len = nums.length;
if(len < 2) return len;
int j = 0;
for(int i = 1;i < len;i++){
if(nums[j] != nums[i]) nums[++j] = nums[i];
}
return j + 1;
}
}