)
最长不连续子串2026 华为OD机试真题 8月5日华为OD上机新系统考试真题 100 分题型点击查看华为 OD 机试真题完整目录2026最新华为OD机试新系统卷 双机位C卷 真题题库目录全覆盖题库 逐点算法考点详解题目描述给定一个整数数组请找出最长的子串使得该子串中任意两个相邻元素的绝对差都严格大于1。输出这个最长子串的长度。例如数组[1, 3, 4, 5, 6, 5, 4]中子串[1, 3]满足条件 (|1-3|21)且是最长的因此答案为2。数组长度为 n0≤n≤1000数组范围 nums[]0≤nums[i]≤10000输入描述输入为一个整数数组数组元素在一行中给出使用英文逗号分隔。数组中可以包含空格例如1, 3, 4, 5当输入为空行时表示空数组。输出描述输出满足条件的最长子串的长度。示例1输入1, 3, 4, 5, 6, 5, 4输出2说明最长子串是[1,3]长度是2示例2输入1, 3, 5, 7输出4说明最长子串是[1, 3, 5, 7]长度是4解题思路核心思想子串要求连续因此只需要从左到右检查相邻元素。如果|nums[i] - nums[i-1]| 1当前合法子串可以继续延长否则以nums[i]重新开始统计。算法步骤若数组为空直接返回0。初始化当前合法子串长度current 1答案answer 1。从第二个元素开始遍历若相邻差值严格大于1令current 1否则当前连续子串断开令current 1。遍历过程中不断更新最大长度。复杂度分析设数组长度为n。时间复杂度O(n)只遍历数组一次。空间复杂度O(1)除输入数组外只使用常数个变量。Javaimportjava.util.*;publicclassMain{staticintsolve(int[]nums){// 空数组没有子串答案为 0if(nums.length0)return0;intanswer1;intcurrent1;// 相邻差值大于 1 时延长当前子串否则从当前位置重新开始for(inti1;inums.length;i){if(Math.abs(nums[i]-nums[i-1])1){current;answerMath.max(answer,current);}else{current1;}}returnanswer;}publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);Stringlinescanner.hasNextLine()?scanner.nextLine().trim():;int[]nums;if(line.isEmpty()){numsnewint[0];}else{String[]partsline.split(,);numsnewint[parts.length];for(inti0;iparts.length;i){nums[i]Integer.parseInt(parts[i].trim());}}System.out.println(solve(nums));}}Pythondefsolve(nums):# 空数组时不存在子串返回 0ifnotnums:return0answer1current1# 逐个检查相邻元素满足差值条件就延长否则重置foriinrange(1,len(nums)):ifabs(nums[i]-nums[i-1])1:current1answermax(answer,current)else:current1returnanswer lineinput().strip()nums[]iflineelse[int(x.strip())forxinline.split(,)]print(solve(nums))JavaScriptconstreadlinerequire(readline);functionsolve(nums){// 空数组直接返回 0if(nums.length0)return0;letanswer1;letcurrent1;// 只需判断相邻差值是否严格大于 1for(leti1;inums.length;i){if(Math.abs(nums[i]-nums[i-1])1){current;answerMath.max(answer,current);}else{current1;}}returnanswer;}constrlreadline.createInterface({input:process.stdin,output:process.stdout});constlines[];rl.on(line,linelines.push(line));rl.on(close,(){constlinelines.length0?lines[0].trim():;constnumsline?[]:line.split(,).map(xNumber(x.trim()));console.log(solve(nums));});C#includebits/stdc.husingnamespacestd;intsolve(constvectorintnums){// 没有元素时最长长度为 0if(nums.empty())return0;intanswer1;intcurrent1;// 连续子串只需要逐对检查相邻元素for(inti1;i(int)nums.size();i){if(abs(nums[i]-nums[i-1])1){current;answermax(answer,current);}else{current1;}}returnanswer;}intmain(){string line;getline(cin,line);vectorintnums;if(!line.empty()){stringstreamss(line);string item;while(getline(ss,item,,)){nums.push_back(stoi(item));}}coutsolve(nums)endl;return0;}Gopackagemainimport(bufiofmtosstrconvstrings)funcsolve(nums[]int)int{// 空数组没有连续子串iflen(nums)0{return0}answer:1current:1// 相邻差值严格大于 1 时当前子串可以延长fori:1;ilen(nums);i{diff:nums[i]-nums[i-1]ifdiff0{diff-diff}ifdiff1{currentifcurrentanswer{answercurrent}}else{current1}}returnanswer}funcmain(){reader:bufio.NewReader(os.Stdin)line,_:reader.ReadString(\n)linestrings.TrimSpace(line)nums:[]int{}ifline!{parts:strings.Split(line,,)for_,part:rangeparts{value,_:strconv.Atoi(strings.TrimSpace(part))numsappend(nums,value)}}fmt.Println(solve(nums))}C语言#includestdio.h#includestdlib.h#includestring.hintsolve(intnums[],intn){// 空数组的最长长度为 0if(n0)return0;intanswer1;intcurrent1;// 每次只需要比较当前元素和前一个元素for(inti1;in;i){intdiffnums[i]-nums[i-1];if(diff0)diff-diff;if(diff1){current;if(currentanswer)answercurrent;}else{current1;}}returnanswer;}intmain(){charline[20000];if(fgets(line,sizeof(line),stdin)NULL)line[0]\0;line[strcspn(line,\r\n)]\0;intnums[1005];intn0;char*tokenstrtok(line,,);while(token!NULL){nums[n]atoi(token);tokenstrtok(NULL,,);}printf(%d\n,solve(nums,n));return0;}完整用例用例11, 3, 4, 5, 6, 5, 4用例21, 3, 5, 7用例3用例45用例51, 2, 3, 4用例610, 8, 6, 5, 3, 1用例70, 2, 4, 6, 8, 10用例84, 4, 7, 7, 10, 12用例910000, 9998, 9997, 9995, 9993, 9992, 9990用例102, 5, 3, 6, 4, 7, 5文章目录**最长不连续子串**题目描述输入描述输出描述示例1示例2解题思路核心思想算法步骤复杂度分析JavaPythonJavaScriptCGoC语言完整用例用例1用例2用例3用例4用例5用例6用例7用例8用例9用例10