华为OD机试真题 新系统-等距二进制判断(C/C++/Py/Java/Js/Go)

等距二进制判断

华为OD机试新系统真题 华为OD上机考试新系统真题 5月20号 100分题型

华为OD机试新系统真题目录点击查看: 华为OD机试真题题库目录|机考题库 + 算法考点详解

题目内容

对于一个二进制数,我们定义相邻两个 1 1 1 之间 0 0 0 的数量为他们两个之间的距离,如 1001011 1001011 1001011,相邻两个 1 1 1 之间的距离从左到右分别为 2 2 2、 1 1 1、 0 0 0。

现在如果一个整数转化为二进制数满足如下条件:

  1. 包含不少于 3 3 3个 1 1 1
  2. 所有相邻数字 1 1 1之间的距离相同 我们称之为等距二进制,如 21 21 21(二进制为: 10101 10101 10101)、 60 60 60(二进制为: 111100 111100 111100)、 146 146 146(二进制为: 10010010 10010010 10010010)。

输入描述

现给定一个输入,整数 0 0 0 <= n n n < ( 2 2 2^ 31 31 31 - 1 1 1)

输出描述

如果 n n n 是等距二进制,请输出它的距离,如果不是等距二进制,请输出 − 1 -1 −1

样例1

输入

复制代码
21

输出

复制代码
1

说明

二进制为 10101 10101 10101,距离为 1 1 1

样例2

输入

复制代码
60

输出

复制代码
0

说明

二进制为 111100 111100 111100,距离为 0 0 0

样例3

输入

复制代码
146

输出

复制代码
2

说明

二进制为 10010010 10010010 10010010,距离为 2 2 2

样例4

输入

复制代码
2

输出

复制代码
-1

说明

二进制为 10 10 10,不满足条件 1 1 1,非等距二进制

题解

思路:二进制处理

  1. 可以通过从低位到高位遍历给定n来判断是不是等距二进制
  2. 初始定义count = 0 记录出现1的次数,distance = -1等距二进制数1的距离,定义last -1用来记录处理过程上一个1出现的位置。index记录当前index位置
  3. 可以通过二进制移位进行二进制遍历,结束条件为n ==0,具体处理为
    • 通过与算法获取当前index位的值value = n & 1value == 0可直接跳过
    • 如果当前value == 1, 进行count += 1.接下来再处理等距逻辑判断,逻辑如下
      • 如果last == -1,说明首次出现1,更新last=index即可。
      • 如果last != -1说明之前低位已存在1
        • 如果此时distance == -1则确定等距为distance = index - last -1
        • 如果distance != -1, 则判断index - last - 1 是否distance相同,不相同则可以直接确定不为等距二进制,直接返回-1
    • 处理完等距逻辑之后,更新last = index,对n >>= 1移位处理,index++
  4. 按照3处理之后,如果count < 3,不满足条件1,直接返回-1.否则返回distance即可

c++

c++ 复制代码
#include<iostream>
#include<vector>
#include<string>
#include <utility> 
#include <sstream>
#include<algorithm> 
#include<cmath>
#include<map>
using namespace std;

int getEqualBinDistance(int n) {
    // 二进制1的数量
    int count = 0;
    // 二进制位
    int index = 0;
    int distance = -1;
    // 上一个1的位置
    int last = -1;
    while (n > 0) {
        // 最末尾二进制值
        int value = n & 1;
        if (value == 1) {
            count++;
            if (last != -1) {
                if (distance == -1) {
                    distance = index - last - 1;
                } else {
                    // 不是等距
                    if (index - last-1 != distance) {
                        return -1;
                    }
                }
            }
            last = index;
        }
        index++;
        n >>= 1;
    }
    // 1数量小于3
    if (count < 3) {
        return  -1;
    }
    return distance;
}


int main() {
    int n;
    cin >> n;
    int res = getEqualBinDistance(n);
    cout << res;
}

Java

JAVA 复制代码
import java.util.*;

public class Main {

    public static int getEqualBinDistance(int n) {

        // 二进制1的数量
        int count = 0;

        // 二进制位
        int index = 0;

        int distance = -1;

        // 上一个1的位置
        int last = -1;

        while (n > 0) {

            // 最末尾二进制值
            int value = n & 1;

            if (value == 1) {

                count++;

                if (last != -1) {

                    if (distance == -1) {
                        distance = index - last - 1;
                    } else {

                        // 不是等距
                        if (index - last - 1 != distance) {
                            return -1;
                        }
                    }
                }

                last = index;
            }

            index++;

            n >>= 1;
        }

        // 1数量小于3
        if (count < 3) {
            return -1;
        }

        return distance;
    }

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        int res = getEqualBinDistance(n);

        System.out.print(res);
    }
}

Python

python 复制代码
def getEqualBinDistance(n):

    # 二进制1的数量
    count = 0

    # 二进制位
    index = 0

    distance = -1

    # 上一个1的位置
    last = -1

    while n > 0:

        # 最末尾二进制值
        value = n & 1

        if value == 1:

            count += 1

            if last != -1:

                if distance == -1:
                    distance = index - last - 1
                else:

                    # 不是等距
                    if index - last - 1 != distance:
                        return -1

            last = index

        index += 1

        n >>= 1

    # 1数量小于3
    if count < 3:
        return -1

    return distance


n = int(input())

res = getEqualBinDistance(n)

print(res)

JavaScript

js 复制代码
const readline = require("readline");

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

function getEqualBinDistance(n) {

    // 二进制1的数量
    let count = 0;

    // 二进制位
    let index = 0;

    let distance = -1;

    // 上一个1的位置
    let last = -1;

    while (n > 0) {

        // 最末尾二进制值
        let value = n & 1;

        if (value === 1) {

            count++;

            if (last !== -1) {

                if (distance === -1) {
                    distance = index - last - 1;
                } else {

                    // 不是等距
                    if (index - last - 1 !== distance) {
                        return -1;
                    }
                }
            }

            last = index;
        }

        index++;

        n >>= 1;
    }

    // 1数量小于3
    if (count < 3) {
        return -1;
    }

    return distance;
}

rl.on("line", function(line) {

    const n = Number(line);

    const res = getEqualBinDistance(n);

    console.log(res);

    rl.close();
});

Go

go 复制代码
package main

import "fmt"

func getEqualBinDistance(n int) int {

	// 二进制1的数量
	count := 0

	// 二进制位
	index := 0

	distance := -1

	// 上一个1的位置
	last := -1

	for n > 0 {

		// 最末尾二进制值
		value := n & 1

		if value == 1 {

			count++

			if last != -1 {

				if distance == -1 {
					distance = index - last - 1
				} else {

					// 不是等距
					if index-last-1 != distance {
						return -1
					}
				}
			}

			last = index
		}

		index++

		n >>= 1
	}

	// 1数量小于3
	if count < 3 {
		return -1
	}

	return distance
}

func main() {

	var n int

	fmt.Scan(&n)

	res := getEqualBinDistance(n)

	fmt.Print(res)
}

C语言

cpp 复制代码
#include <stdio.h>

int getEqualBinDistance(int n) {

    // 二进制1的数量
    int count = 0;

    // 二进制位
    int index = 0;

    int distance = -1;

    // 上一个1的位置
    int last = -1;

    while (n > 0) {

        // 最末尾二进制值
        int value = n & 1;

        if (value == 1) {

            count++;

            if (last != -1) {

                if (distance == -1) {
                    distance = index - last - 1;
                } else {

                    // 不是等距
                    if (index - last - 1 != distance) {
                        return -1;
                    }
                }
            }

            last = index;
        }

        index++;

        n >>= 1;
    }

    // 1数量小于3
    if (count < 3) {
        return -1;
    }

    return distance;
}

int main() {

    int n;

    scanf("%d", &n);

    int res = getEqualBinDistance(n);

    printf("%d", res);

    return 0;
}
相关推荐
largecode6 天前
怎么让手机显示公司名?来电显示公司名称认证实现品牌外显
linux·ubuntu·华为od·华为·智能手机·华为云·harmonyos
无限码力21 天前
华为OD新系统机试真题 - 日志文件异常检测
华为od·华为od机考·华为od机试真题·华为od上机考试真题·华为od机考真题·华为od新系统机试真题·华为od新系统机试
无限码力25 天前
2026最新华为OD新系统机试解析 + 最新题库 + 备考策略
华为od·华为od机考·华为od机试真题·华为od机试·华为od新系统机试真题·2026华为od新系统机试题库·华为od机考题库
无限码力1 个月前
华为OD机试真题 新系统 - API请求日志去重分析 (C/C++/Py/Java/Js/Go)
华为od·华为od机试真题·华为od上机考试真题·华为od机考真题·华为od4月15号机试真题·华为od新系统真题
无限码力1 个月前
华为OD技术面真题 - Python开发 - 4
python·华为od·华为od技术面真题·华为od面试八股文·华为od面试真题·华为odpython开发真题·华为od技术面题目
无限码力1 个月前
华为OD机试真题 新系统 - 直捣黄龙 (C/C++/Py/Java/Js/Go)
华为od·华为od机试真题·华为od上机考试真题·华为od机考真题·华为od新系统机试真题·华为od4月8号机试真题
无限码力1 个月前
华为OD技术面真题 - JAVA开发- spring框架 - 7
java·开发语言·华为od·华为od面试真题·华为odjava八股文·华为odjava开发题目·华为odjava开发高频题目
无限码力2 个月前
华为OD机试双机位C卷真题-红黑图(C/C++/Py/Java/Js/Go)
华为od·华为od机试真题·华为od机试双机位c卷·华为od上机考试真题·华为od机考真题·华为od机试-红黑图·华为od机考真题-红黑图
无限码力2 个月前
华为OD机试双机位C卷-用户入网定期复评(C/C++/Py/Java/Js/Go)
华为od·华为od机试真题·华为od机试双机位c卷·华为od上机考试真题·华为od机考真题·华为od-用户入网定期复评