阿里笔试4.1

4.1 的场,考之前以为做完一道题提交了才能看第二题,所以第一题没通过就一直在死磕没来得及看第二题
第一题自测给出的样例和自己随便编了几个样例都是正确的,不明白为什么通过率是0
发出来思路各位指点一下到底错在哪里😭😭
题目:给一串二进制字符串如00011001,希望把他改为全为0,如果更改某个字符,那么他两边的字符也要更改,例如把第二位的0换成1,那么就变成了11111001.
如果无法变为全0,那么返回NO
以下是我的思路:
递归思想i=1~n-2,设立一个flag,flag=1表示之前的字符串s[0:i]为全零,flag=2表示s[i-1]=1,再之前的全为0,flag=0表示前方字符串除了最后一位还有其他的1无法更改
然后根据s[i]的值判断动作

n=int(input())
for i in range(n):
    s=list(str(input()))
    if len(s)==1:
        if s=='1':
            print(1)
        else:
            print(0)
        continue
    ls=len(s)
    if s[0]=='0':
        flag=1
    else:
        flag=2
    j=1
    num=0
    while j<ls-1 and flag:
        if flag==1:
            if s[j]=='1':
                flag=2
            j=j+1
        else:
            if s[j]=='1':
                num=num+1
                if s[j+1]=='0':
                    s[j+1]='1'
                else:
                    s[j+1]='0'
                flag=1
                j=j+1
            else:
                flag=0
                break
        
    if flag==1:
        if s[ls-1]=='1':
            flag=0
    elif flag==2:
        if s[ls-1]=='1':
            flag=1
            num=num+1
        else:
            flag=0
    
    if flag==0:
        print ('NO')
    else:
        print(num)

测试样例
2
01
011
输出
NO
1
以上代码测试是正确的,自己又编了几个10101输出NO,000111000输出1,都是测试正确的,不知道错在哪里了正确率为0.。。
#阿里笔试##阿里巴巴#
全部评论
大家不用担心笔试爆0没有面试的,可能还要结合简历看,我就是还没笔试就收到了一面,然后被面试官催去笔试。。。身边同学也有笔试双0但接到面试的~放宽心等吧
3 回复 分享
发布于 2020-04-01 18:00
我没参加这次考试,准备过几天参加,不过看了你的题目描述,我自己做了一下 核心思想就是从第0位开始,如果希望把该位变成0,则对下一位做操作 比如 10101,想把s[0]变成0,则对s[1]做操作,得到 01001,想把s[1]变成0,对s[2]操作,得到00111,想把s[2]变成0。。。。最后判断最后一位是否为0就行了 #include <iostream> #include <string> using namespace std; void _flip(string &s, int i) { s[i] = s[i] == '0' ? '1' : '0'; } void flip(string &s, int i) { _flip(s, i - 1); _flip(s, i); if (i < s.length() - 1) { _flip(s, i + 1); } } int judge(string s) { int cnt = 0; for (int i = 0; i < s.length() - 1; i++) { if (s[i] == '1') { flip(s, i + 1); //为了让当前第i位变成0,对i+1位做翻转操作 cnt++; } } return s.back() == '0' ? cnt : -1; } int main() { int N; cin >> N; while (N--) { string s; cin >> s; int ret = judge(s); if (ret == -1) { cout << "NO" << endl; } else { cout << ret << endl; } } return 0; }
2 回复 分享
发布于 2020-04-02 22:25
一二位的处理一下,三位的从001-111手推一下都是能变为0的,考虑一下4位的,无脑把第一位变成0,后面的不就是一个三位的了么,递归推一下,就是说大于3位的都是可以变成0的。
2 回复 分享
发布于 2020-04-02 10:50
通过改变后一位使得当前位翻转,第一位翻转和第一位不翻转都考虑一下存不存在哪种情况满足
1 回复 分享
发布于 2020-04-02 18:38
可以用减而治之的策略,把前面的0都不予考虑,从第一个1开始,将它的下一位变号,这样前面为零的区域又增加了,如此循环,最终只看最后一位是否为0
1 回复 分享
发布于 2020-04-02 17:23
这题应该从头到尾,依次变为0,如果不行就不行
点赞 回复 分享
发布于 2020-04-01 21:17
判断出错了吧,我直觉想过去,只要长度大于3好像就不会No了,我是暴力求解。 假设字符串长度为len,那么每一个位置有翻转和不翻转两种情况,因为不可能一个位置翻转两次,翻转两次不就变回来了吗,所以是O(2^len)次方复杂度,过了80%。 这个题目1<=len<=20,凭做题的感觉这题应该没有O(n)或者O(n^2)的解,如有不对请指出。
点赞 回复 分享
发布于 2020-04-01 18:50
和题主问题一样,我后来才发现是类似101011,这种情况没有通过
点赞 回复 分享
发布于 2020-04-01 18:27
我也是能想到的测试用例都通过了,case0,很烦,可能是算法没想对
点赞 回复 分享
发布于 2020-04-01 18:17
这个我没做出来。。。。不过我看你的测试10101是可以变过来的,10101->11011->00011->00000,需要3步
点赞 回复 分享
发布于 2020-04-01 18:00

相关推荐

不愿透露姓名的神秘牛友
07-02 17:28
25届每天都在焦虑找工作的事情0offer情绪一直很低落硬撑着面了一个岗位岗位有应酬的成分面试的时候hr给我出各种场景题问的问题比较犀利&nbsp;有点压力面的感觉感觉有点回答不上来本来就压抑的情绪瞬间爆发了呢一瞬间特别想哭觉得自己特别没用没绷住掉眼泪了事后想想觉得自己挺有病的&nbsp;真的破大防了
喜欢唱跳rap小刺猬...:我觉得没关系吧,之前有一次面试leader给我压力面,我顶住了压力,结果入职的时候发现组里氛围很差,果断跑路。其实从面试就能大概看出组的情况,面试体验好的组倒是不一定好,但是面试体验不好的组。。。就很难说
点赞 评论 收藏
分享
评论
2
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务