目录
一、题目解释
给定一个二进制字符串 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; }