2026华为OD面试题022:分辨率排序
题目描述视频清晰度有 4 个档位每个档位对应一个最小的宽×高门槛4K3840 × 21602K2560 × 14401080P1920 × 1080720P1280 × 720档位大小关系720P 1080P 2K 4K。给定任意一个分辨率宽×高匹配档位的规则是宽和高要同时大于等于某个档位的最小宽高才算满足该档位并且优先往高里匹配。举个例子2600x14004K 门槛 3840×21602600 3840不满足2K 门槛 2560×14402600 2560但 1400 1440不满足1080P 门槛 1920×10802600 1920 且 1400 1080满足所以2600x1400算 1080P。还有三条特殊规则所有低于 720P 的分辨率统统算 720P。最大档位就是 4K只要满足 4K 标准再大也算 4K。不考虑交换宽高。比如2500x3200宽不够 2K 但高够也只能往下匹配成 1080P不能算 2K。分辨率大小比较规则先比档位档位高的排前面。档位相同比面积宽×高面积大的排前面。面积还相同比宽宽大的排前面。输入n 组 “宽x高” 字符串空格间隔n 10。输出从大到小排序后输出。原题文件在输入输出示例处截断这里按常见题型补全输出按空格间隔排在一行。讲个故事产品经理的清晰度需求小李在视频平台做后端。有天产品经理丢过来一串分辨率2600x1400 1920x1080 3840x2160 1280x720说按清晰度从高到低排一下前端要展示给用户选。小李心想这不就是排序嘛按面积排不就完了结果产品经理补了一句“2600x1400这种算 1080P不算 2K规则我都写在文档里了。”小李打开文档一看档位匹配不是看面积大小是看宽高是否同时达标而且要从高往低试。这下有点意思了。核心原理定档 三连排序这题拆成两步就清楚了。第一步给每个分辨率定档。定档的本质是从最高的 4K 开始往下试宽和高同时达标才算数第一个匹配上的就是它的档位。4K宽 3840 且 高 21602K宽 2560 且 高 14401080P宽 1920 且 高 1080都不满足算 720P低于 720P 的也兜底成 720P注意是同时光宽够高不够不行。所以2600x1400卡在 2K 的 1440 这道坎上掉到 1080P。第二步按三连规则排序。档位高的在前4K 2K 1080P 720P档位相同面积宽×高大的在前面积也相同宽大的在前拿样例验证一下3840x21604K2600x14001080P面积 3,640,0001920x10801080P面积 2,073,6001280x720720P排序结果3840x2160 2600x1400 1920x1080 1280x720。两个 1080P 之间比面积2600x1400面积更大排前面。怎么实现读入所有 token按空格切成一个个 “WxH” 字符串对每个字符串按 x 拆出宽和高写个 getLevel 函数从 4K 往下判断档位算面积 宽 × 高用 long long 防溢出按档位降序、面积降序、宽降序排序输出排序后的原始字符串代码实现C 语言#includestdio.h#includestdlib.h#includestring.htypedefstruct{charraw[32];intw,h;intlevel;// 4K4, 2K3, 1080P2, 720P1longlongarea;}Res;intgetLevel(intw,inth){if(w3840h2160)return4;if(w2560h1440)return3;if(w1920h1080)return2;return1;}intcmp(constvoid*a,constvoid*b){constRes*xa,*yb;if(x-level!y-level)returny-level-x-level;// 档位降序if(x-area!y-area)returnx-areay-area?1:-1;// 面积降序returnx-wy-w?1:-1;// 宽降序}intmain(){charbuf[4096];size_tlenfread(buf,1,sizeof(buf)-1,stdin);buf[len]\0;Res arr[16];intn0;char*tokstrtok(buf, \t\r\n);while(tok){strcpy(arr[n].raw,tok);chart[32];strcpy(t,tok);for(char*pt;*p;p)if(*pX)*px;intw0,h0;sscanf(t,%dx%d,w,h);arr[n].ww;arr[n].hh;arr[n].levelgetLevel(w,h);arr[n].area(longlong)w*h;n;tokstrtok(NULL, \t\r\n);}qsort(arr,n,sizeof(Res),cmp);for(inti0;in;i)printf(%s%c,arr[i].raw,i1n? :\n);return0;}C#includebits/stdc.husingnamespacestd;intgetLevel(intw,inth){if(w3840h2160)return4;if(w2560h1440)return3;if(w1920h1080)return2;return1;}structRes{string raw;intw,level;longlongarea;};intmain(){vectorResv;string tok;while(cintok){string ttok;for(charc:t)if(cX)cx;intpt.find(x);intwstoi(t.substr(0,p));inthstoi(t.substr(p1));v.push_back({tok,w,getLevel(w,h),(longlong)w*h});}sort(v.begin(),v.end(),[](constResa,constResb){if(a.level!b.level)returna.levelb.level;if(a.area!b.area)returna.areab.area;returna.wb.w;});for(inti0;i(int)v.size();i)coutv[i].raw \n[i1(int)v.size()];return0;}Javaimportjava.util.*;publicclassMain{staticintgetLevel(intw,inth){if(w3840h2160)return4;if(w2560h1440)return3;if(w1920h1080)return2;return1;}staticclassRes{Stringraw;intw,level;longarea;Res(Strings){raws;String[]sps.split([xX]);wInteger.parseInt(sp[0]);inthInteger.parseInt(sp[1]);levelgetLevel(w,h);area(long)w*h;}}publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);ListReslistnewArrayList();while(sc.hasNext()){list.add(newRes(sc.next()));}list.sort((a,b)-{if(a.level!b.level)returnb.level-a.level;if(a.area!b.area)returnLong.compare(b.area,a.area);returnInteger.compare(b.w,a.w);});StringBuildersbnewStringBuilder();for(inti0;ilist.size();i){if(i0)sb.append( );sb.append(list.get(i).raw);}System.out.println(sb);}}JavaScriptfunctiongetLevel(w,h){if(w3840h2160)return4;if(w2560h1440)return3;if(w1920h1080)return2;return1;}functionsolve(tokens){constlisttokens.map(s{const[w,h]s.split(/[xX]/).map(Number);return{raw:s,w,level:getLevel(w,h),area:w*h};});list.sort((a,b){if(a.level!b.level)returnb.level-a.level;if(a.area!b.area)returnb.area-a.area;returnb.w-a.w;});returnlist.map(rr.raw).join( );}constfsrequire(fs);constinputfs.readFileSync(0,utf8);consttokensinput.trim().split(/\s/).filter(Boolean);console.log(solve(tokens));Pythonimportsysdefget_level(w,h):ifw3840andh2160:return4ifw2560andh1440:return3ifw1920andh1080:return2return1defmain():tokenssys.stdin.read().split()parsed[]forsintokens:w,hmap(int,s.lower().split(x))parsed.append((get_level(w,h),w*h,w,s))# 档位降序、面积降序、宽降序parsed.sort(keylambdax:(-x[0],-x[1],-x[2]))print( .join(p[3]forpinparsed))main()复杂度分析解析 n 个分辨率O(n)排序O(n * log n)总时间复杂度O(n * log n)题目里 n 10基本是常数级空间复杂度O(n)总结一下这题看着是排序真正的考点在档位匹配规则。套路就两步定档从 4K 往下试宽高同时达标才算数两个兜底低于 720P 算 720P高于 4K 算 4K不交换宽高排序三连档位、面积、宽全部降序容易踩的坑是把宽高同时达标看成宽或高达标或者拿面积直接定档。2600x1400就是专门用来骗这个的面积比 1080P 大但卡在 2K 的 1440 高度上只能算 1080P。你做这种带规则的排序题是先把规则理清再写代码还是先写个朴素排序再说欢迎在评论区聊聊。