2026/4/15 6:22:21
网站建设
项目流程
怎么做接口网站,菏泽网站建设价格,网站后续建设说明,上海人才网站首页完美走位 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录#xff5c;机考题库 算法考点详解
其它语言题解链接
华为OD机试真题 - 完美走位 (Python C JAVA JS 机考题库 算法考点详解其它语言题解链接华为OD机试真题 - 完美走位 (Python C JAVA JS GO)题目描述在第一人称射击游戏中玩家通过键盘的A、S、D、W四个按键控制游戏人物分别向左、向后、向右、向前进行移动从而完成走位。假设玩家每按动一次键盘游戏任务会向某个方向移动一步如果玩家在操作一定次数的键盘并且各个方向的步数相同时此时游戏任务必定会回到原点则称此次走位为完美走位。现给定玩家的走位例如ASDA请通过更换其中一段连续走位的方式使得原走位能够变成一个完美走位。其中待更换的连续走位可以是相同长度的任何走位。请返回待更换的连续走位的最小可能长度。如果原走位本身是一个完美走位则返回0。输入描述输入为由键盘字母表示的走位s例如ASDA输出描述输出为待更换的连续走位的最小可能长度。用例1输入WASDAASD输出1说明将第二个A替换为W即可得到完美走位示例二输入AAAA输出3说明将其中三个连续的A替换为WSD即可得到完美走位.题解思路本题采用滑动窗口解决题目对于完美走位定义其实就是字符串中ASWD字母数量相同。对于一个不完美走位的字符串通过修改一段连续的走位要想变成完美走位那么这段连续走位必须满足包含所有多于平均数量的字符并且每种多余平均数量的字符 在一段连续走位中数量大于等于多余部分数量。可能有点抽象举个例子例如现在A多两个B多一个。找的区间必须满足这段区间至少包含两个A和一个B。满足上述条件的最短区间就是这道题的结果。对于这类题可直接采用滑动窗口进行解决计算AWSD每个字符在原字符串中的数量以及超过的数量。如果都等于平均数量则已经是完美走位输出0否则进行下面逻辑。定义left 0, right 0, right开始不断右移直到区间内满足上述2分析的要求时这时候要寻求最短区间尝试左边界右移缩小边界直到不满足3的要求时继续尝试right右移。记录上述逻辑满足条件的最短窗口长度就是结果。code#includestdio.h#includestring.hintmain(){// 长度可以根据输入长度变换chars[100010];scanf(%s,s);intnstrlen(s);// 不可能有解冗余处理if(n%4){printf(-1\n);return0;}inttargetn/4;// 记录每个字符的数量intcount_A0,count_S0,count_D0,count_W0;// 统计每个字符的数量for(inti0;in;i){switch(s[i]){caseA:count_A;break;caseS:count_S;break;caseD:count_D;break;caseW:count_W;break;}}// 计算多余数量intexcess_A(count_Atarget)?count_A-target:0;intexcess_S(count_Starget)?count_S-target:0;intexcess_D(count_Dtarget)?count_D-target:0;intexcess_W(count_Wtarget)?count_W-target:0;// 已经是完美走位if(excess_Aexcess_Sexcess_Dexcess_W0){printf(0\n);return0;}// 滑动窗口intmin_lenn;intwindow_A0,window_S0,window_D0,window_W0;intleft0;for(intright0;rightn;right){// 更新窗口计数switch(s[right]){caseA:window_A;break;caseS:window_S;break;caseD:window_D;break;caseW:window_W;break;}// 当窗口满足条件时收缩 满足条件窗口内所有字符大于等于 对应字符超过平均的数量while(leftrightwindow_Aexcess_Awindow_Sexcess_Swindow_Dexcess_Dwindow_Wexcess_W){intlenright-left1;if(lenmin_len)min_lenlen;// 左指针移动更新窗口计数switch(s[left]){caseA:window_A--;break;caseS:window_S--;break;caseD:window_D--;break;caseW:window_W--;break;}left;}}printf(%d\n,min_len);return0;}