华为字节二面原题--三等分
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为字节二面原题--三等分相关的知识,希望对你有一定的参考价值。
题目
题目解析
该题没什么特殊技巧,就是要有分离问题的逻辑思维能力,由于要划分三等分的二进制码,只需要保证数字大小相同就行了,那么很快可以得到两个关键信息:
- 三等分中1的个数肯定是相同的。
- 三等分中前导0对他们的大小无任何影响,但后导0会有影响。
三等分究极详解手写图:
- 根据以上关键信息我们可以得出符合以下四种情况才有三等分:
- 通过从左到右计数确定每个1区间的开始与结束(让每个区间内都有相同数量的1)。
- 然后判断每个1区间的长度(保证每个1区间内的长度相等)。
- 判断各个1区间内各个位置的关系(保证每个1区间中对应位置数字相同)。
- 由于前导0不会影响数字的大小,而后导0会影响,所以记录最后的后导0,然后对每个1区间后的0个数判断(保证能分配出相同的后导0,使得数字大小相同)。
根据思路设计程序
class Solution {
public:
vector<int> threeEqualParts(vector<int>& arr) {
int len = arr.size();
int sum = 0;
vector<int>res(2);
res[0] = res[1] = -1;
for(auto&& t:arr){
sum+=t;
}//判断一:如果1的个数不符合分成三份,则不可能分三等分
if(sum%3)return res;
//全是0,无论怎么分都有三等分
if(!sum)return vector<int>{0,2};
int T = sum/3;
//开始扫描记录1存在的区间
int a1,b1,a2,b2,a3,b3;
int cnt = 0;
for(int i=0;i<len;i++){
if(arr[i]==1){
cnt++;
if(cnt==1)
a1 = i;
if(cnt==T)
b1 = i;
if(cnt==T+1)
a2 = i;
if(cnt==2*T)
b2 = i;
if(cnt==2*T+1)
a3 = i;
if(cnt==3*T)
b3 = i;
}
}//判断二:查看三个1区间的宽度是否一致,如若不一致,则必定不存在相等的三份
if(b1-a1!=b2-a2||b2-a2!=b3-a3)
return res;
//判断三:防止宽度一致,但中间0导致的数字大小不一致的情况
for(int i=0;i<=b1-a1;i++){
if(arr[a1+i]!=arr[a2+i]||arr[a2+i]!=arr[a3+i])
return res;
}
//判断四:判断后导0的个数是否能符合.
int q = len-1-b3;
if(a2-b1-1<q||a3-b2-1<q)
return res;
//经过万难终于确定答案
return vector<int>{b1+q,b2+q+1};
}
};
以上是关于华为字节二面原题--三等分的主要内容,如果未能解决你的问题,请参考以下文章
华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题???
华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题???