华为OD机试2025C卷-座位调整[100分]( Java _ Python3 _ C++ _ C语言 _ JsNode _ Go)实现100%通过率 📅 2026/6/28 1:00:41 个人主页深夜coding算法 专栏系列2026年华为最新OD机试题库详解 一次订阅永久解锁 | 持续更新100篇 | 6语言全覆盖文章目录❄️前言☀️一题目描述 题目名称 题目内容 输入描述 输出描述 示例1 示例2 示例3☀️二题目解析☀️三解题思路☀️四代码实现CJavaPython3C语言JavaScriptGo☀️五复杂度分析⭐ 六易错点坑1检查范围越界坑2边坐边更新共勉❄️前言这道题猛一看像是左右观察的复杂逻辑但捋清楚之后就是一层循环搞定——每个空位能不能坐取决于左边的人和右边的人。一次遍历判断放座。☀️一题目描述 题目名称座位调整 题目内容疫情期间课堂里需要间隔就坐。用一个由0和1组成的字符串表示座位情况其中0表示座位是空的1表示座位已被占用。要求对空座位进行调整使得任意两个占用座位之间至少隔两个空座位即占用的座位之间最少间隔两个座位计算最多还能安排几人就坐。 输入描述输入一行字符串由0和1组成表示当前座位占用情况。 输出描述输出一个整数表示最多还能安排几人就坐。 示例1输入 01001 输出 1说明在位置01001中第一个0索引0与已有1相邻不能坐最后一个0索引4可以插入一人。结果01011因此答案是 1。 示例2输入 000 输出 1说明三个连续空位在中间位置索引1坐一人即可满足条件。 示例3输入 101 输出 0说明所有空位都被左右1夹着无法安排新人。☀️二题目解析要点解读间隔至少2个空位占用座位之间至少隔两个0最多安排人数贪心从左扫到右能坐就坐0 和 1 的字符串输入是纯字符串只包含字符0和1☀️三解题思路贪心遍历对于每个位置 i同时检查左边和右边的两个位置是否都为空。如果是则占座并计数。遍历每个位置 i 1当前位置是空位arr[i]0 2左边两个位置没有占用i1 或 arr[i-1]!1、i2 或 arr[i-2]!1 3右边两个位置没有占用i1n 或 arr[i1]!1、i2n 或 arr[i2]!1 满足三个条件 → 坐下arr[i]1计数1☀️四代码实现C#includeiostream#includestringusingnamespacestd;intmain(){string s;cins;intns.size(),cnt0;for(inti0;in;i){if(s[i]1)continue;// 已占用跳过boolleftOk(i1||s[i-1]!1)(i2||s[i-2]!1);boolrightOk(i1n||s[i1]!1)(i2n||s[i2]!1);if(leftOkrightOk){s[i]1;// 占座cnt;}}coutcntendl;return0;}Javaimportjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);char[]ssc.nextLine().toCharArray();intns.length,cnt0;for(inti0;in;i){if(s[i]1)continue;booleanleftOk(i1||s[i-1]!1)(i2||s[i-2]!1);booleanrightOk(i1n||s[i1]!1)(i2n||s[i2]!1);if(leftOkrightOk){s[i]1;cnt;}}System.out.println(cnt);}}Python3slist(input().strip())nlen(s)cnt0foriinrange(n):ifs[i]1:continueleft_ok(i1ors[i-1]!1)and(i2ors[i-2]!1)right_ok(i1nors[i1]!1)and(i2nors[i2]!1)ifleft_okandright_ok:s[i]1cnt1print(cnt)C语言#includestdio.h#includestring.hintmain(){chars[1024];scanf(%s,s);intnstrlen(s),cnt0;for(inti0;in;i){if(s[i]1)continue;intleftOk(i1||s[i-1]!1)(i2||s[i-2]!1);intrightOk(i1n||s[i1]!1)(i2n||s[i2]!1);if(leftOkrightOk){s[i]1;cnt;}}printf(%d\n,cnt);return0;}JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});rl.on(line,(line){consts[...line.trim()];constns.length;letcnt0;for(leti0;in;i){if(s[i]1)continue;constleftOk(i1||s[i-1]!1)(i2||s[i-2]!1);constrightOk(i1n||s[i1]!1)(i2n||s[i2]!1);if(leftOkrightOk){s[i]1;cnt;}}console.log(cnt);rl.close();});Gopackagemainimportfmtfuncmain(){varsstringfmt.Scan(s)b:[]byte(s)n,cnt:len(b),0fori:0;in;i{ifb[i]1{continue}leftOk:(i1||b[i-1]!1)(i2||b[i-2]!1)rightOk:(i1n||b[i1]!1)(i2n||b[i2]!1)ifleftOkrightOk{b[i]1cnt}}fmt.Println(cnt)}☀️五复杂度分析指标数值时间复杂度O(N)空间复杂度O(N)⭐ 六易错点坑1检查范围越界检查左右邻居时注意数组边界用i1、i1n等条件兜底。坑2边坐边更新每坐一个人就要把当前位置标记为1否则后面的人统计时不会把它当成已占用。共勉贪心题的核心就一句话能坐就坐别犹豫。想多了反而把自己绕进去。关于本专栏一次订阅永久解锁全部100篇真题详解6语言全覆盖Java | Python3 | C | C语言 | JsNode | Go以上就是本篇博客的所有内容觉得有帮助的话记得点赞收藏关注走一波~~