华为2022.08.03笔试第一题思路分享(码流等分)

题目:码流等分

二进制码流(字符串),将该码流切分成3段,每一段都得到相同的二进制值。
例如:输入为1010010,可以切分为10 10 010这三段,都表示十进制中的2。如果无法做到,则输入-1。如果码流全部为0,则视为无法做到,输出-1

示例输入:100101000001001010000100101
示例输出:100101 00000100101 0000100101

思路:

如果这3段子串相等,则每一个子串中1的个数一定是相等的。所以想到统计字符串中所有1的个数,然后除以三,如果能除得尽,则根据1的个数确定每个有效子串(以1开头,暂时忽略左侧的0)的左边界。
function spliceCode(str) {
    let arr = str.split('');
    // 统计有多少个1
    let numOfOne = str.match(/1/g, "").length;
    console.log(numOfOne);

    if (numOfOne % 3 === 0) {
        numOfOne = numOfOne / 3;
    } else {
        console.log(-1)
        return -1;
    }
    console.log(numOfOne)

        // 根据1的位置确定有效子串的左边界
    let left1 = 0, right1 = 0, left2 = 0, right2 = 0, left3 = 0, right3 = arr.length - 1;
    let tempnum = 0;
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] === '1') { tempnum++; }
        if (tempnum === numOfOne) { left2 = i + 1; }
        if (tempnum === numOfOne * 2) { left3 = i + 1; }
    }
    while (arr[left1] === '0') { left1++; }
        
        // 根据第三个子串的长度来确定每个有效子串的右边界。
    let newlength = right3 - left3 + 1;
    right1 = left1 + newlength - 1;
    right2 = left2 + newlength - 1;

    // 对比这三个子串内部是否相等
    for (let k = 0; k < newlength; k++) {
        if (!(arr[left1 + k] === arr[left2 + k] && arr[left1 + k] === arr[left3 + k])) {
            return -1;
        }
    }
        // 如果相等,则补上有效子串前面的0(也即 以上一个子串的右边界+1为当前子串的左边界。)
    let substr1 = arr.slice(0, right1 + 1).join('');
    let substr2 = arr.slice(right1 + 1, right2 + 1).join('');
    let substr3 = arr.slice(right2 + 1).join('');
    console.log(substr1 + ' ' + substr2 + ' ' + substr3);

}

let arr = "000100101000001001010000100101";
spliceCode(arr)    
😥但是系统一直提示“超出CPU限制”。而且直接console.log也会提示超出cpu限制,有点无语……

后来就改成了python版本(代码附后面),结果也超时……
# If you need to import additional packages&nbs***bsp;classes, please import here.
def func():

    # please define the python3 input here. For example: a,b = map(int, input().strip().split())
    # please finish the function body here.
    # please define the python3 output here. For example: print().
    strs = "00100101000001001010000100101"
    arr = list(strs)
    # 统计有多少个1
    numOfOne = strs.count('1')
    print(numOfOne)

    if (numOfOne % 3 == 0):
        numOfOne = numOfOne / 3
    else:
        print(-1)
        return -1

    print(numOfOne)

    left1 = 0
    right1 = 0

    left2 = 0
    right2 = 0
    left3 = 0
    right3 = len(arr) - 1

    tempnum = 0
    for i in range(len(arr)):
        if (arr[i] == '1'):
            tempnum = tempnum+1
        if (tempnum == numOfOne):
            left2 = i + 1
        if (tempnum == numOfOne * 2):
            left3 = i + 1

    while (arr[left1] == '0'):
        left1 = left1+1

    newlength = right3 - left3 + 1
    right1 = left1 + newlength - 1
    right2 = left2 + newlength - 1

    for k in range(newlength):
        if not(arr[left1+k] == arr[left2+k] and arr[left1+k] == arr[left3+k]):
            return -1

    substr1 = ''.join(arr[0:right1+1])
    substr2 = ''.join(arr[right1 + 1: right2 + 1])
    substr3 = ''.join(arr[right2 + 1:])

    print(substr1 + ' ' + substr2 + ' ' + substr3)


if __name__ == "__main__":
    func()


写的代码可能比较拉跨,欢迎各位指正并交流。
#华为笔试#
全部评论
提供一个思路不知道对不对,记录1的个数的同时记录1的位置,保存在数组里,如果数组个数不能被3整除就返回-1,如果可以将数组元素分成三组,计算每组后一项减前一项的差,三组都相等返回1,否则返回-1,不知道对不对😂
2 回复 分享
发布于 2022-08-04 16:18
C++才能过。。。。。无语
点赞 回复 分享
发布于 2022-08-03 21:48
这是哪个部门啊?不应该是10号左右吗?
点赞 回复 分享
发布于 2022-08-03 21:56
大佬最后拿了多少分。。。 我今天属实拉跨了 只拿了120
点赞 回复 分享
发布于 2022-08-03 22:52
这题数据量多大,我只会暴力+调用atoi
点赞 回复 分享
发布于 2022-08-04 15:26
我想这是用双指针来做的,结果不管写个啥都是超出cpu限制,无语了
点赞 回复 分享
发布于 2022-08-04 19:53
理想汽车2023提前批校招目前已开启,有打算找工作的师弟师妹们,可以通过以下链接内推投递,全程进度跟随,无笔试。 https://www.nowcoder.com/discuss/1008400
点赞 回复 分享
发布于 2022-08-08 20:08
go写的,是不是写复杂了😂,我是这样想的,每组的最后一个数必然一样,结尾是0就找0的个数,是1就找1的个数,分完后在验证每组位置分布,因为数量一样,结尾一样,只有一种分法。
点赞 回复 分享
发布于 2022-08-22 21:48 天津

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
美丽的查理斯不讲武德:包kpi的啊,感觉虾皮一点hc都没有
点赞 评论 收藏
分享
评论
6
26
分享
牛客网
牛客企业服务