輪轉數組
給定一個整數數組 nums,將數組中的元素向右輪轉 k 個位置,其中 k 是非負數。
示例 1:
輸入: nums = [1,2,3,4,5,6,7], k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右輪轉 1 步: [7,1,2,3,4,5,6]
向右輪轉 2 步: [6,7,1,2,3,4,5]
向右輪轉 3 步: [5,6,7,1,2,3,4]
示例 2:
輸入:nums = [-1,-100,3,99], k = 2
輸出:[3,99,-1,-100]
解釋:
向右輪轉 1 步: [99,-1,-100,3]
向右輪轉 2 步: [3,99,-1,-100]
思路:都是在數組末尾和開頭做操作 直接用數組方法,
不過用數組方法并沒有體現算法思想,用算法思想來搞反轉三次,第一次反轉整個數組,第二次反轉前k個,第三次反轉剩余部分,
// 最快方法
var rotate = function(nums,key){nums.unshift(...nums.splice(nums.length - k % nums.length, k))}
//此方法超時
var rotate = function(nums, k) {let nums1 = [...nums]for(let i = 0 ; i < k ; i++){let res = nums1.pop()nums1.unshift(res)}return nums1};
//用算法做
const reverse = (nums, start, end) => {while (start < end) {[nums[start++], nums[end--]] = [nums[end], nums[start]];}}function rotate(nums, k) {if (!nums || nums.length === 0) {return [];}k %= nums.length;if (k <= 0) {return nums;}reverse(nums, 0, nums.length - 1);console.log(nums)reverse(nums, 0, k - 1);console.log(nums)reverse(nums, k, nums.length - 1);console.log(nums)return nums;}
//[ 6, 5, 4, 3, 2, 1 ]
//[ 4, 5, 6, 3, 2, 1 ]
//[ 4, 5, 6, 1, 2, 3 ]
除自身以外數組的乘積
給你一個整數數組?nums
,返回?數組?answer
?,其中?answer[i]
?等于?nums
?中除?nums[i]
?之外其余各元素的乘積?。
題目數據?保證?數組?nums
之中任意元素的全部前綴元素和后綴的乘積都在??32 位?整數范圍內。
請?**不要使用除法,**且在?O(_n_)
?時間復雜度內完成此題。
示例 1:
輸入: nums = [1,2,3,4]
輸出: [24,12,8,6]
示例 2:
輸入: nums = [-1,1,0,-3,3]
輸出: [0,0,9,0,0]
思路:前綴和和后綴和相乘 兩次for循環
var productExceptSelf = function(nums) {let answer = new Array(nums.length).fill(1)let prefix = 1;for (let i = 1; i < nums.length; i++) {prefix = nums[i -1] * prefixanswer[i] *= prefix}let suffix = 1;for(let i = nums.length -2; i >= 0; i--){suffix = nums[i + 1] *suffixanswer[i] *= suffix}return answer};
找到字符串中所有字母異位詞
中等
相關標簽
相關企業
給定兩個字符串 s 和 p,找到 s 中所有 p 的 異位詞 的子串,返回這些子串的起始索引。不考慮答案輸出的順序。
異位詞 指由相同字母重排列形成的字符串(包括相同的字符串)。
示例 1:
輸入: s = “cbaebabacd”, p = “abc”
輸出: [0,6]
解釋:
起始索引等于 0 的子串是 “cba”, 它是 “abc” 的異位詞。
起始索引等于 6 的子串是 “bac”, 它是 “abc” 的異位詞。
示例 2:
輸入: s = “abab”, p = “ab”
輸出: [0,1,2]
解釋:
起始索引等于 0 的子串是 “ab”, 它是 “ab” 的異位詞。
起始索引等于 1 的子串是 “ba”, 它是 “ab” 的異位詞。
起始索引等于 2 的子串是 “ab”, 它是 “ab” 的異位詞。
思路:維護一個滑動窗口 用charCodeat方法獲取字母的ascall碼值.
var findAnagrams = function(s, p) {const len = s.length// 首先定義一個長度為26的數組charNumList,用來存放每個小寫字母出現的次數。const charNumList = new Array(26).fill(0)const res = []let left = 0, right = 0for (let i = 0; i < p.length; i++) {// 對于字符串p中的每個字母,通過p[i].charCodeAt() - 97獲取其ASCII碼值,并將其減去97,// 得到該字母在charNumList中對應的下標。將該下標的元素值+1,表示該字母出現了一次。charNumList[p[i].charCodeAt() - 97]++}while (right < len) {// charNumList[s[right].charCodeAt() - 97]-- 將當前字符對應的元素值-1,表示該字符出現了一次。charNumList[s[right].charCodeAt() - 97]--// charNumList[s[right].charCodeAt() - 97] < 0,// 當前字符在s中出現的次數已經超過了p中出現的次數,// 則需要移動左指針進行調整,直到當前字符在s中出現的次數小于等于p中出現的次數。while (charNumList[s[right].charCodeAt() - 97] < 0) {charNumList[s[left].charCodeAt() - 97]++left++}//說明找到了一個滿足條件的“字母異位詞”,將left保存在結果數組res中if (right - left + 1 === p.length) {res.push(left)}right++}return res};