网站建设策划书的主要内容国内自动化网站建设
2026/4/18 7:31:40 网站建设 项目流程
网站建设策划书的主要内容,国内自动化网站建设,wordpress系统要求,文档生成器app922. 按奇偶排序数组 II 问题描述 给定一个非负整数数组 nums#xff0c;其中一半整数是奇数#xff0c;另一半是偶数。 你需要对数组进行重排序#xff0c;使得对于所有偶数索引 i#xff0c;nums[i] 是偶数#xff1b;对于所有奇数索引 i#xff0c;nums[i] 是奇数。 返…922. 按奇偶排序数组 II问题描述给定一个非负整数数组nums其中一半整数是奇数另一半是偶数。你需要对数组进行重排序使得对于所有偶数索引inums[i]是偶数对于所有奇数索引inums[i]是奇数。返回满足条件的任意一种重排序结果。示例输入: nums [4,2,5,7] 输出: [4,5,2,7] 解释: - 索引0偶数: 4偶数 - 索引1奇数: 5奇数 - 索引2偶数: 2偶数 - 索引3奇数: 7奇数 其他有效答案包括: [4,7,2,5], [2,5,4,7], [2,7,4,5]算法思路双指针使用两个指针even指针从索引0开始每次移动2步只检查偶数位置odd指针从索引1开始每次移动2步只检查奇数位置遍历偶数位置如果nums[even]是奇数说明放错了位置在奇数位置中找到一个偶数即nums[odd]是偶数交换这两个元素额外数组创建两个列表分别存储偶数和奇数按照索引的奇偶性依次从对应列表中取值填充结果数组代码实现方法一双指针原地交换classSolution{/** * 按奇偶排序数组 II - 双指针原地交换 * * param nums 输入数组包含等量的奇数和偶数 * return 重排序后的数组偶数索引放偶数奇数索引放奇数 */publicint[]sortArrayByParityII(int[]nums){intnnums.length;inteven0;// 偶数索引指针从0开始intodd1;// 奇数索引指针从1开始// 遍历所有偶数位置while(evenn){// 如果偶数位置放的是奇数if(nums[even]%21){// 在奇数位置中找到一个偶数while(nums[odd]%21){odd2;// 跳到下一个奇数位置}// 交换偶数位置的奇数和奇数位置的偶数swap(nums,even,odd);}even2;// 移动到下一个偶数位置}returnnums;}/** * 交换数组中两个位置的元素 */privatevoidswap(int[]nums,inti,intj){inttempnums[i];nums[i]nums[j];nums[j]temp;}}方法二优化双指针classSolution{/** * 优化同时移动两个指针 */publicint[]sortArrayByParityII(int[]nums){intnnums.length;inteven0;intodd1;while(evennoddn){// 找到放错位置的偶数索引应该是偶数但放了奇数while(evennnums[even]%20){even2;}// 找到放错位置的奇数索引应该是奇数但放了偶数while(oddnnums[odd]%21){odd2;}// 如果两个指针都有效交换它们if(evennoddn){swap(nums,even,odd);even2;odd2;}}returnnums;}privatevoidswap(int[]nums,inti,intj){inttempnums[i];nums[i]nums[j];nums[j]temp;}}方法三额外数组classSolution{/** * 额外数组使用两个列表分别存储偶数和奇数 */publicint[]sortArrayByParityII(int[]nums){ListIntegerevensnewArrayList();ListIntegeroddsnewArrayList();// 分离偶数和奇数for(intnum:nums){if(num%20){evens.add(num);}else{odds.add(num);}}// 按照索引奇偶性重新填充int[]resultnewint[nums.length];intevenIndex0,oddIndex0;for(inti0;inums.length;i){if(i%20){result[i]evens.get(evenIndex);}else{result[i]odds.get(oddIndex);}}returnresult;}}方法四一次遍历填充classSolution{/** * 一次遍历填充直接计算每个元素应该放的位置 */publicint[]sortArrayByParityII(int[]nums){intnnums.length;int[]resultnewint[n];intevenPos0;// 下一个偶数应该放的位置intoddPos1;// 下一个奇数应该放的位置for(intnum:nums){if(num%20){result[evenPos]num;evenPos2;}else{result[oddPos]num;oddPos2;}}returnresult;}}算法分析方法时间复杂度空间复杂度双指针原地交换O(n)O(1)优化双指针O(n)O(1)额外数组O(n)O(n)一次遍历填充O(n)O(n)算法过程输入nums [4,2,5,7]方法一初始even0,odd1,nums[4,2,5,7]even0:nums[0]4偶数even2even2:nums[2]5奇数查找奇数位置的偶数odd1,nums[1]2偶数交换nums[2]和nums[1]→nums[4,5,2,7]even4超出范围结束返回[4,5,2,7]输入nums [2,3]even0:nums[0]2偶数even2结束返回[2,3]输入nums [3,2]even0:nums[0]3奇数odd1:nums[1]2偶数交换 →nums[2,3]返回[2,3]测试用例publicstaticvoidmain(String[]args){SolutionsolutionnewSolution();// 测试用例1标准示例int[]nums1{4,2,5,7};int[]result1solution.sortArrayByParityII(nums1.clone());System.out.println(Test 1: Arrays.toString(result1));// [4,5,2,7] 或其他有效答案// 测试用例2已经正确排序int[]nums2{2,1,4,3};int[]result2solution.sortArrayByParityII(nums2.clone());System.out.println(Test 2: Arrays.toString(result2));// [2,1,4,3]// 测试用例3完全逆序int[]nums3{1,0,3,2};int[]result3solution.sortArrayByParityII(nums3.clone());System.out.println(Test 3: Arrays.toString(result3));// [0,1,2,3] 或其他有效答案// 测试用例4两元素int[]nums4{2,3};int[]result4solution.sortArrayByParityII(nums4.clone());System.out.println(Test 4: Arrays.toString(result4));// [2,3]int[]nums5{3,2};int[]result5solution.sortArrayByParityII(nums5.clone());System.out.println(Test 5: Arrays.toString(result5));// [2,3]// 测试用例6大数组int[]nums6{1,2,3,4,5,6,7,8};int[]result6solution.sortArrayByParityII(nums6.clone());// 验证结果的正确性booleanvalid6true;for(inti0;iresult6.length;i){if(i%20result6[i]%2!0)valid6false;if(i%21result6[i]%2!1)valid6false;}System.out.println(Test 6valid6);// true// 测试用例7全偶数在前int[]nums7{2,4,6,8,1,3,5,7};int[]result7solution.sortArrayByParityII(nums7.clone());booleanvalid7true;for(inti0;iresult7.length;i){if(i%20result7[i]%2!0)valid7false;if(i%21result7[i]%2!1)valid7false;}System.out.println(Test 7:valid7);// true// 测试用例8包含0int[]nums8{0,1,2,3};int[]result8solution.sortArrayByParityII(nums8.clone());System.out.println(Test 8: Arrays.toString(result8));// [0,1,2,3] 或其他有效答案}关键点双指针偶数指针只关注偶数位置奇数指针只关注奇数位置当发现错位时必然能在对方的位置找到可交换的元素原地操作空间复杂度为O(1)不需要额外的存储空间常见问题为什么双指针不会出现死循环奇数和偶数数量相等每次交换都会修复两个错位的位置最多需要n/2次交换就能完成

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询