小红的数字删除

题目不难,忽略了一个 corner case,导致我在某次面试没有 AK。

10003

对于这个 case,只考虑前导零 + 全部删除是不对的,剩下的 3 也不能删。

void solve(){
    string s;
    cin >> s;

    int res=0;
    vector<int> a(10, 0);
    for(char x:s) {
        a[x-'0']++;
        res+=x-'0';
    }
    res%=3;

    int ans=0;
    a[3]+=a[6]+=a[9];
    a[1]+=a[4]+=a[7];
    a[2]+=a[5]+=a[8];
    if(res==0){
        ans=a[3]+a[0];
    }
    else {
        int x=res;
        if(a[x]>=2){
            ans=1+a[3]+a[0];
        }
        else if(a[x]==1){
            if((s[0]-'0')%3==x){
                int idx=1;
                while(idx<s.size()&&(s[idx]=='0')) idx++;
                ans=1+a[3]+a[0]-(idx-1);
                if(ans==1)ans=0;
                if(ans+(idx-1)==s.size()) ans--;
            }
            else{
                ans=1+a[3]+a[0];
            }
        }
        else ans = 0;
    }
    if(ans==(int)s.size()) ans--;
    cout<<ans<<'\n';
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐