华为2019秋招笔试Java实现(1)

笔试日期2019年8月14日,语言Java

第一题(100分)

题目描述

在一个int型整数(对应的比特流)中查找某个比特块(本题固定为5,即二进制’101’)出现的次数及首次出现的位置,说明:

1、输出次数和首次出现的位置中间用空格隔开

2、位置从0开始,即最右边位置为0,向左依次增加

3、如果该int型整数中没有找到该比特块,次数返回0,位置返回-1

4、比特位允许重复使用,如’10101’中的中间的比特1即可以与前面的’01’组成‘101’,也可以与后面的’10’组成‘101

输入描述

一个任意的十进制int型整数

输出描述

在输入整数对应的二进制比特流中,比特块(101)出现的次数和首次出现的位置,次数和位置分别以十进制int型整数表示,中间用空格隔开。

示例

输入

21

输出

2 0

分析

举个例子,21的二进制为10101,从右往左数,'101’第一次出现的位置是0,出现次数是2.

那么按一般思路来说,问题分三步:

  • 转二进制

  • 首次出现位置

  • 出现次数

第一步就很简单,直接用Integer.toBinaryString就好了,或者用高中学的老办法

第二、三步我们可以结合’101’这个特点分析,只要满足三位是’101’,也就是满足连续三位为’1’,‘0’,‘1’,那用三指针就能解决问题。直接搞三个变量,分别判断就是。

这题有个陷阱,位置是从右往左计算的,但示例’10101’从左往右数也是相同的结果,记得用‘1010’,也就是10,测试一遍。

解答

import java.util.Scanner;
public 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值