7.26华为OD机试真题 新系统 - 区分奇偶的数组排序 (Java/Py/C/C++/Js/Go)

发布时间:2026/7/28 16:59:00
7.26华为OD机试真题 新系统 - 区分奇偶的数组排序 (Java/Py/C/C++/Js/Go) 区分奇偶的数组排序2026 华为OD机试真题 7月26日华为OD上机新系统考试真题 100 分题型点击查看华为 OD 机试真题完整目录2026最新华为OD机试新系统卷 双机位C卷 真题题库目录全覆盖题库 逐点算法考点详解题目描述给定一个非负整数数组nums满足以下两个前提条件数组长度为偶数且 2≤nums.length≤20000数组中恰好有一半元素是偶数另一半元素是奇数请你对该数组进行重构满足以下两个核心要求重构后的数组中所有位于偶数下标下标从 0 开始的元素必须是偶数所有位于奇数下标的元素必须是奇数重构后所有占据偶数下标的偶数元素需按照从小到大的升序排列所有占据奇数下标的奇数元素也需按照从小到大的升序排列返回满足上述所有条件的重构后数组。补充说明数组长度 n 满足 2≤n≤20000且 n%20数组中的元素为非负整数满足 0≤nums[i]≤1000数组中偶数和奇数的数量严格相等各占 n/2 个满足条件的输出数组是唯一的示例1输入4,2,5,7输出2,5,4,7说明偶数元素为[4,2]升序后为[2,4]奇数元素为[5,7]升序后为[5,7]。示例2输入1,3,2,6,8,5输出2,1,6,3,8,5说明偶数元素为[2,6,8]升序后仍为[2,6,8]奇数元素为[1,3,5]升序后仍为[1,3,5]示例3输入9,0,3,4,7,2输出0,3,2,7,4,9说明偶数元素为[0,4,2]升序后为[0,2,4]奇数元素为[9,3,7]升序后为[3,7,9]解题思路核心思想题目要求偶数下标放偶数奇数下标放奇数并且两个位置序列内部都要升序。因此可以先把原数组拆成两个数组偶数数组和奇数数组分别排序后再按下标奇偶交替放回结果数组。因为题目保证偶数和奇数数量相等所以排序后的偶数数组一定能填满所有偶数下标排序后的奇数数组也一定能填满所有奇数下标。算法步骤按示例格式读取一行输入用英文逗号切分得到nums。遍历nums将偶数加入evens奇数加入odds。分别对evens和odds升序排序。创建结果数组ans。依次取排序后的偶数放到0, 2, 4...下标取排序后的奇数放到1, 3, 5...下标。将结果数组按英文逗号拼接输出。复杂度分析设数组长度为n。拆分数组复杂度为O(n)。两个子数组排序总复杂度为O(n log n)。合并结果复杂度为O(n)。总时间复杂度为O(n log n)空间复杂度为O(n)。Javaimportjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importjava.util.Scanner;publicclassMain{staticint[]solve(int[]nums){// 拆分出所有偶数和奇数分别排序ListIntegerevensnewArrayList();ListIntegeroddsnewArrayList();for(intnum:nums){if(num%20){evens.add(num);}else{odds.add(num);}}Collections.sort(evens);Collections.sort(odds);// 偶数按升序放偶数下标奇数按升序放奇数下标int[]ansnewint[nums.length];for(inti0;ievens.size();i){ans[i*2]evens.get(i);ans[i*21]odds.get(i);}returnans;}publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);Stringlinescanner.hasNextLine()?scanner.nextLine().trim():;String[]partsline.split(,);int[]numsnewint[parts.length];for(inti0;iparts.length;i){nums[i]Integer.parseInt(parts[i].trim());}int[]anssolve(nums);StringBuildersbnewStringBuilder();for(inti0;ians.length;i){if(i0){sb.append(,);}sb.append(ans[i]);}System.out.println(sb.toString());}}Pythondefsolve(nums):# 分别收集偶数和奇数并各自升序排序evenssorted(numfornuminnumsifnum%20)oddssorted(numfornuminnumsifnum%21)# 按偶数下标、奇数下标交替放入结果数组ans[0]*len(nums)foriinrange(len(evens)):ans[i*2]evens[i]ans[i*21]odds[i]returnans lineinput().strip()numslist(map(int,line.split(,)))print(,.join(map(str,solve(nums))))JavaScriptconstreadlinerequire(readline);functionsolve(nums){// 拆分偶数和奇数并分别升序排序constevensnums.filter((num)num%20).sort((a,b)a-b);constoddsnums.filter((num)num%21).sort((a,b)a-b);// 偶数放偶数下标奇数放奇数下标constansnewArray(nums.length);for(leti0;ievens.length;i){ans[i*2]evens[i];ans[i*21]odds[i];}returnans;}constrlreadline.createInterface({input:process.stdin,output:process.stdout,terminal:false});letline;rl.on(line,(input){lineinput.trim();});rl.on(close,(){constnumsline.split(,).map((item)Number(item.trim()));console.log(solve(nums).join(,));});C#includealgorithm#includeiostream#includesstream#includestring#includevectorusingnamespacestd;vectorintsolve(constvectorintnums){// 将偶数和奇数拆开后分别排序vectorintevens;vectorintodds;for(intnum:nums){if(num%20){evens.push_back(num);}else{odds.push_back(num);}}sort(evens.begin(),evens.end());sort(odds.begin(),odds.end());// 偶数填入偶数下标奇数填入奇数下标vectorintans(nums.size());for(inti0;i(int)evens.size();i){ans[i*2]evens[i];ans[i*21]odds[i];}returnans;}intmain(){string line;getline(cin,line);vectorintnums;stringstreamss(line);string item;while(getline(ss,item,,)){nums.push_back(stoi(item));}vectorintanssolve(nums);for(inti0;i(int)ans.size();i){if(i0){cout,;}coutans[i];}coutendl;return0;}Gopackagemainimport(bufiofmtossortstrconvstrings)funcsolve(nums[]int)[]int{// 拆分偶数和奇数后分别排序evens:make([]int,0)odds:make([]int,0)for_,num:rangenums{ifnum%20{evensappend(evens,num)}else{oddsappend(odds,num)}}sort.Ints(evens)sort.Ints(odds)// 按下标奇偶填入对应序列ans:make([]int,len(nums))fori:0;ilen(evens);i{ans[i*2]evens[i]ans[i*21]odds[i]}returnans}funcmain(){scanner:bufio.NewScanner(os.Stdin)line:ifscanner.Scan(){linestrings.TrimSpace(scanner.Text())}parts:strings.Split(line,,)nums:make([]int,0,len(parts))for_,part:rangeparts{value,_:strconv.Atoi(strings.TrimSpace(part))numsappend(nums,value)}ans:solve(nums)out:make([]string,len(ans))fori,value:rangeans{out[i]strconv.Itoa(value)}fmt.Println(strings.Join(out,,))}C语言#includestdio.h#includestdlib.h#includestring.hintcmpInt(constvoid*a,constvoid*b){return*(constint*)a-*(constint*)b;}voidsolve(intnums[],intn,intans[]){// 拆分偶数和奇数并分别排序intevens[20000];intodds[20000];intevenCount0;intoddCount0;for(inti0;in;i){if(nums[i]%20){evens[evenCount]nums[i];}else{odds[oddCount]nums[i];}}qsort(evens,evenCount,sizeof(int),cmpInt);qsort(odds,oddCount,sizeof(int),cmpInt);// 偶数升序放偶数下标奇数升序放奇数下标for(inti0;ievenCount;i){ans[i*2]evens[i];ans[i*21]odds[i];}}intmain(){charline[200000];if(fgets(line,sizeof(line),stdin)NULL){return0;}intnums[20000];intn0;char*tokenstrtok(line,,);while(token!NULL){nums[n]atoi(token);tokenstrtok(NULL,,);}intans[20000];solve(nums,n,ans);for(inti0;in;i){if(i0){printf(,);}printf(%d,ans[i]);}printf(\n);return0;}完整用例用例14,2,5,7用例21,3,2,6,8,5用例39,0,3,4,7,2用例42,1用例58,6,4,2,1,3,5,7用例610,9,8,7,6,5,4,3用例70,1000,999,1用例812,11,12,11,10,9,8,7用例914,13,2,1,6,5,10,9,8,7,4,3用例1020,18,16,14,12,10,1,3,5,7,9,11文章目录区分奇偶的数组排序题目描述示例1示例2示例3解题思路核心思想算法步骤复杂度分析JavaPythonJavaScriptCGoC语言完整用例用例1用例2用例3用例4用例5用例6用例7用例8用例9用例10