1// 整数 0、 1 和 2 分别表示红色、白色和蓝色 2/** 3 * @param {number[]} nums 4 * @return {void} Do not return anything, modify nums in-place instead. 5 */ 6var sortColors = function(nums) { 7 let red = 0, white = 0, blue = 0; 8 nums.forEach(el => { 9 if(el === 0) { 10 red++ 11 } else if(el === 1) { 12 white++ 13 } else { 14 blue++ 15 } 16 }); 17 18 for (let i = 0, l = nums.length; i < l; i++) { 19 if(i < red) { 20 nums[i] = 0; 21 } else if (i < red + white) { 22 nums[i] = 1; 23 } else { 24 nums[i] = 2; 25 } 26 } 27 28 return nums; 29}; 30 31// 0,1,2 排序。一次遍历,如果是0,则移动到表头,如果是2,则移动到表尾,不用考虑1 32let sortColors1 = function(nums) { 33 for (let i = 0, j = 0, k = nums.length - 1; i <= k; i++) { 34 if (nums[i] === 0) { 35 [nums[i], nums[j++]] = [nums[j], nums[i]]; 36 } else if (nums[i] === 2) { 37 [nums[k--], nums[i--]] = [nums[i], nums[k]]; 38 } 39 } 40}; 41 42// 不需要额外空间 43var sortColors2 = function(nums) { 44 for(var i=0, l = nums.length; i < l; i++) { 45 if(nums[i] === 0) { 46 nums.splice(i,1); 47 nums.unshift(0); 48 } else if(nums[i] === 2) { 49 nums.splice(i,1); 50 nums.push(2); 51 l--; 52 i--; 53 } 54 } 55 56 return nums; 57}; 58 59ensureEqual(sortColors([2,0,2,1,1,0]), [0,0,1,1,2,2], 'test 1');