华为字节二面原题--三等分

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为字节二面原题--三等分相关的知识,希望对你有一定的参考价值。

题目

在这里插入图片描述
oj平台

题目解析

该题没什么特殊技巧,就是要有分离问题的逻辑思维能力,由于要划分三等分的二进制码,只需要保证数字大小相同就行了,那么很快可以得到两个关键信息:

  1. 三等分中1的个数肯定是相同的。
  2. 三等分中前导0对他们的大小无任何影响,但后导0会有影响。

三等分究极详解手写图:
在这里插入图片描述

  • 根据以上关键信息我们可以得出符合以下四种情况才有三等分:
  1. 通过从左到右计数确定每个1区间的开始与结束(让每个区间内都有相同数量的1)。
  2. 然后判断每个1区间的长度(保证每个1区间内的长度相等)。
  3. 判断各个1区间内各个位置的关系(保证每个1区间中对应位置数字相同)。
  4. 由于前导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?这不是直接送分题???

华为二面!!!面试官直接问我Java中到底什么是NIO?这不是直接送分题???

北大高代考研题解答

字节跳动二面