游酷盛世笔试

小红的01串-AI自测

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

// 检查字符串是否为好串(不含"010"或"101")
bool isGood(string s) {
    for(int i = 0; i < s.length() - 2; i++) {
        if((s[i] == '0' && s[i+1] == '1' && s[i+2] == '0') || 
          (s[i] == '1' && s[i+1] == '0' && s[i+2] == '1')) {
            return false;
        }
    }
    return true;
}

// 计算翻转次数
int test(string s) {
    int n = s.length();
    string s1 = s;  // 原始字符串的副本
    int flips1 = 0; // 第一种情况的翻转次数
    
    // 情况1:从原始字符串开始修改
    for(int i = 0; i < n-2; i++) {
        if((s1[i] == '0' && s1[i+1] == '1' && s1[i+2] == '0') ||
          (s1[i] == '1' && s1[i+1] == '0' && s1[i+2] == '1')) {
            s1[i+2] = (s1[i+2] == '0' ? '1' : '0'); // 翻转第i+2位
            flips1++;
            i = max(-1, i-2); // 回退检查
        }
    }
    
    // 情况2:从相反的修改开始
    string s2 = s;
    int flips2 = 0;
    for(int i = n-1; i >= 2; i--) {
        if((s2[i-2] == '0' && s2[i-1] == '1' && s2[i] == '0') ||
          (s2[i-2] == '1' && s2[i-1] == '0' && s2[i] == '1')) {
            s2[i-2] = (s2[i-2] == '0' ? '1' : '0'); // 翻转第i-2位
            flips2++;
            i = min(n, i+2); // 前进检查
        }
    }
    
    // 检查两种情况的结果并返回最小值
    int result1 = isGood(s1) ? flips1 : n + 1;
    int result2 = isGood(s2) ? flips2 : n + 1;
    cout << min(result1, result2) <<endl;
}
// #include <vector>
// #include <climits>
// #include <algorithm>
// #include <string>
// #include <iostream>
// #include <cstring> 
// using namespace std;

// int test(string s) {
//     int n = s.size();
//     if (n < 3) return 0; // 无需修改

//     // 初始化动态规划数组,prev_dp[a][b]表示前两个字符为a和b的最小翻转次数
//     int prev_dp[2][2];
//     for (int a = 0; a < 2; a++) {
//         for (int b = 0; b < 2; b++) {
//             prev_dp[a][b] = (a != (s[0] - '0')) + (b != (s[1] - '0'));
//         }
//     }

//     // 从第三个字符开始处理
//     for (int i = 2; i < n; i++) {
//         int current_dp[2][2];
//         fill(¤t_dp[0][0], ¤t_dp[0][0] + 4, INT_MAX); // 初始化为极大值
//         int orig = s[i] - '0';

//         // 遍历所有可能的前两个字符组合
//         for (int a = 0; a < 2; a++) {
//             for (int b = 0; b < 2; b++) {
//                 if (prev_dp[a][b] == INT_MAX) continue; // 无效状态跳过

//                 // 尝试当前字符变为0或1
//                 for (int c = 0; c < 2; c++) {
//                     // 检查是否形成坏模式 "010" 或 "101"
//                     if ((a == 0 && b == 1 && c == 0) || (a == 1 && b == 0 && c == 1)) {
//                         continue; // 非法组合,跳过
//                     }

//                     // 计算总翻转次数
//                     int cost = prev_dp[a][b] + (c != orig ? 1 : 0);
//                     // 更新当前状态的最小值
//                     if (cost < current_dp[b][c]) {
//                         current_dp[b][c] = cost;
//                     }
//                 }
//             }
//         }

//         // 将当前状态转移到prev_dp
//         memcpy(prev_dp, current_dp, sizeof(prev_dp));
//     }

//     // 找到最终所有可能状态的最小值
//     int result = INT_MAX;
//     for (int a = 0; a < 2; a++) {
//         for (int b = 0; b < 2; b++) {
//             result = min(result, prev_dp[a][b]);
//         }
//     }
//     cout << result << endl;
//     return result;
// }
int main() {
    test("010101"); // 预期: 2
    test("010");    // 预期: 1
    test("111");    // 预期: 0
    test("0000");   // 预期: 0
    test("1010");   // 预期: 1 
    test("100100"); // 1
    test("01010");  // 1

    return 0;
}

全部评论
他这题也太难了吧,兄弟你a了几道题啊
点赞 回复 分享
发布于 03-20 17:22 陕西

相关推荐

时间线:3.24&nbsp;投递简历&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.26&nbsp;笔试&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.9&nbsp;&nbsp;&nbsp;一面&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.18&nbsp;二面+流程终止😁真是离了个大谱!!其实游酷一面面试体验可以说是暑期面试最好的,考察很全面,面试官人也好,最后反问环境很耐心和全面给你解答问题。😅然后二面我是真的看不懂了,全程30分钟,一道手撕然后两个开放问题,问完急急忙忙说好了就到这然后马上挂了,反问也不反问,甚至我再见都没说完就下线了,然后晚上一看流程终止。😂接下来详细讲讲这个二面的面试官。我抽到手撕题是删除链表中有重复的元素,然后是核心代码模式,我就问了一下面试官这个参数的head是哑节点还是第一个数据节点,他模模糊糊说了一些然后说是哑节点,我就按哑节点开始写。写完一跑有错误样例,就是输入是&nbsp;{}然后输出是{}但是我的报错。逆天的来了,面试官和我说空的情况你返回“{}”(没错,他说返回“括号”)才对,我直接懵了,我跟他说这个下面的输入输出显示是牛客自己内部处理显示出来的吧,这个函数返回值是ListNode*,要返回nullptr吧。他就模模糊糊:哦哦,对对那就返回这个。后面我调好了再跑,又碰到有不过的样例,我就开始调试,调了一下发现head压根不是哑节点,就是指向第一个数据的节点,我就跟面试官说明,他就说哦哦然后让我改,改了一会终于通过了,接下来就是开头提到的两个开放问题,讲一下项目难点和你学的新技术,然后就光速下线。😓是我面试后跟hr吐槽这个面试官不专业的原因吗?但是实在是让人忍不住吐槽啊,友友们,换做你们会怎么想?#面试# #kpi面#
查看3道真题和解析
点赞 评论 收藏
分享
评论
1
11
分享

创作者周榜

更多
牛客网
牛客企业服务