小红的数字删除
题目不难,忽略了一个 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';
}