1016-子串能表示从 1 到 N 数字的二进制串

目录

一、题目解释

二、代码

三、用时和内存详情

四、算法解析

4.1、十进制转二进制

4.2、循环比较


一、题目解释

给定一个二进制字符串 s 和一个正整数 n,如果对于 [1, n] 范围内的每个整数,其二进制表示都是 s 的 子字符串 ,就返回 true,否则返回 false 。

子字符串 是字符串中连续的字符序列。

示例 1:

输入:s = "0110", n = 3输出:true

示例 2:

输入:s = "0110", n = 4输出:false

二、代码

class Solution {
    public boolean queryString(String s, int n) {
        boolean flag = true;
        for (int i = 1; i <= n; i++) {
            String binary = getBinary(i);
            if (!s.contains(binary)) {
                flag = false;
                return flag;
            }
        }
        return flag;
    }

    private static String getBinary(int i) {
        String s = "";
        while (i / 2 != 0) {
            s = i % 2 + s;
            i = i / 2;
        }
        s = i % 2 + s;
        return s;
    }
}

三、用时和内存详情

四、算法解析

4.1、十进制转二进制

十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。

所以根据十进制转二进制的介绍先写一个方法 getBinary(int i) 来实现获取一个整数的二进制字符串

/** * 获取一个整数的二进制字符串 * @param i * @return */ private static String getBinary(int i) { // 定义一个空字符串来存储返回的二进制字符串 String s = ""; // 整数除以2如果商不为0则继续 while (i/2 != 0) { // 获取到余数,并拼接到字符串的前面 s = i%2 + s; // 该整数除以2获取到商后继续判断 i = i/2; } // 当除以2后商为0,则获取到余数并拼接到字符串前面 s = i%2 + s; return s; }

4.2、循环比较

使用for循环来判断1~n的所有数的二进制字符串是不是被s包含(使用String的自带方法contains),如果包含则直接输出false,判断到n后全都是s的子串则输出true,

public boolean queryString(String s, int n) { // 循环遍历1~n for (int i = 1; i <= n; i++) { // 调用获取整数的二进制字符串的方法 String binary = getBinary(i); // 入伙binary不是s的子串,则直接返回false if(!s.contains(binary)) { return false; } } // 遍历完成表示1~n都是s的子串,则输出true return true; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值