在一個長度爲n的數組裏的全部數字都在1到n的範圍內,數組中只有一個數字是重複的而且只重複一次,請找出數組中重複的數字。算法複雜度要求爲O(n)。算法
/** * 高斯求和 * @param len 數組長度 * @returns {number} 返回多餘重複數字之外的總和 */ function gauss(len) { return len * (len - 1) / 2 } // 數組求和 function getSum(nums) { return nums.reduce((sum, num) => sum + num) } // 找重 function duplicate(nums) { const len = nums.length if (len <= 1) return false return getSum(nums) - gauss(len) } let numbers = [1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10] console.log(duplicate(numbers)) // 5
在一個長度爲n的數組裏的全部數字都在0到n-1的範圍內,數組中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每一個數字重複幾回。請找出數組中任意一個重複的數字。數組
/** * 把當前序列當成是一個下標和下標對應值是相同的數組 * @param nums 數組 * @returns {*} 重複數字的數組 */ function duplicate(nums) { const len = nums.length if (len <= 1) return false let duplications = [] for (let i = 0; i < len; i++) { if (nums[i] < 0 || nums[i] >= len) return false // 當前位的值和下標是不等時,則將當前位置 i 上的元素和 a[i] 位置上的元素比較 while (nums[i] !== i) { if (nums[i] === nums[nums[i]]) { duplications.push(nums[i]) break } // 當前位置 i 上的元素和 a[i] 位置上的元素不等時,則進行交換 let temp = nums[i] nums[i] = nums[temp] nums[temp] = temp } } return duplications } let numbers = [2, 3, 6, 1, 5, 2, 3] console.log(duplicate(numbers))
在一個長度爲n的數組裏的全部數字都在0到n-1的範圍內,請將是數組中全部奇數排在偶數以前。算法複雜度要求爲O(n)。code
/** * 奇數在前,偶數在後 * @param nums * @returns {*} */ function oddEven(nums) { let start = 0, end = nums.length - 1; while(start < end) { // 從下標爲 start 開始,找到第一個偶數 while(start < end && nums[start] % 2 === 1) { start++; } // 從下標爲 end 開始,找到第一個奇數 while(start < end && nums[end] % 2 === 0) { end--; } // 奇數與偶數交換 let temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; } return nums; } let nums = [9, 5, 4, 8, 6, 3, 2, 1, 7]; console.log(oddEven(nums));