首页 > 其他分享 >[LeetCode] 1545. Find Kth Bit in Nth Binary String

[LeetCode] 1545. Find Kth Bit in Nth Binary String

时间:2024-10-20 08:51:47浏览次数:1  
标签:Binary 1545 reverse invert Si Sn 字符串 S1 String

Given two positive integers n and k, the binary string Sn is formed as follows:
S1 = "0"
Si = Si - 1 + "1" + reverse(invert(Si - 1)) for i > 1
Where + denotes the concatenation operation, reverse(x) returns the reversed string x, and invert(x) inverts all the bits in x (0 changes to 1 and 1 changes to 0).

For example, the first four strings in the above sequence are:
S1 = "0"
S2 = "011"
S3 = "0111001"
S4 = "011100110110001"
Return the kth bit in Sn. It is guaranteed that k is valid for the given n.

Example 1:
Input: n = 3, k = 1
Output: "0"
Explanation: S3 is "0111001".
The 1st bit is "0".

Example 2:
Input: n = 4, k = 11
Output: "1"
Explanation: S4 is "011100110110001".
The 11th bit is "1".

Constraints:
1 <= n <= 20
1 <= k <= 2n - 1

找出第 N 个二进制字符串中的第 K 位。

给你两个正整数 n 和 k,二进制字符串 Sn 的形成规则如下: S1 = "0" 当 i > 1 时,Si = Si-1 + "1" + reverse(invert(Si-1)) 其中 + 表示串联操作,reverse(x) 返回反转 x 后得到的字符串,而 invert(x) 则会翻转 x 中的每一位(0 变为 1,而 1 变为 0)。

例如,符合上述描述的序列的前 4 个字符串依次是:
S1 = "0"
S2 = "011"
S3 = "0111001"
S4 = "011100110110001"
请你返回 Sn 的 第 k 位字符 ,题目数据保证 k 一定在 Sn 长度范围以内。

思路

这道题的思路是递归。注意这个条件,当 i > 1 时,Si = Si-1 + "1" + reverse(invert(Si-1)),当前字符串 Si 是由 Si-1 得到的。因着这个规则,我们可以试图用递归做。

  • 如果 k 是中间那个 1,那么就返回 1
  • 如果 k 在左半边,那么就递归去找 Si - 1 的 k 位上的字符
  • 如果 k 在右半边,那么就递归去找 Si - 1,然后找到与 k 轴对称的那个 index,再做 invert 操作,是 0 则返回 1,是 1 则返回 0。

找与 k 轴对称的那个 index 的方法,自己需要演算一下。

复杂度

时间O(n) - 每次递归就找原长度的一半即可
空间O(n) - 栈空间

代码

Java实现

class Solution {
    public char findKthBit(int n, int k) {
		// 如果长度是1,那么就是S1
        if (n == 1) {
            return '0';
        }
		// 如果k恰好是中间那个digit,那么就是1
        int len = (int) Math.pow(2, n) - 1;
        if (k == (len + 1) / 2) {
            return '1';
        }
        // if at the first half
        if (k < (len + 1) / 2) {
            return findKthBit(n - 1, k);
        }
		// 如果k是右半边的digit,找到k在上一个字符串里的位置的reverse位置上的digit再返回他的invert的值
        return findKthBit(n - 1, len - k + 1) == '1' ? '0' : '1';
    }
}

标签:Binary,1545,reverse,invert,Si,Sn,字符串,S1,String
From: https://www.cnblogs.com/cnoodle/p/18486891

相关文章

  • lua插件之----【luaString 字符串类】
    API列表 接口原型说明luaString.left(str,num)获取字符串左侧指定数量的字符luaString.right(str,num)获取字符串右侧指定数量的字符luaString.mid(str,pos,num)获取字符串指定起始位置后的几个字符luaString.lTrim(str,filterStr)去掉字符串左侧指定......
  • 常用APIStringBuilder类
    StringBuilder代表可变字符串对象,相当于是一个容器,它里面的字符串是可以改变的,就是用来操作字符串的。好处:StringBuilder比String更合适做字符串的修改操作,效率更高,代码也更加简洁。1StringBuilder方法演示1.1字符串拼接接问题:builder.append();可以拼接int、long、d......
  • 出现WrongArgumentException: Malformed database URL, failed to parse the connecti
    目录1.问题所示2.原理分析3.解决方法1.问题所示编辑数据源的时候,后端出现如下BugThelastpacketsentsuccessfullytotheserverwas0millisecondsago.Thedriverhasnotreceivedanypacketsfromtheserver.com.mysql.cj.jdbc.exceptions.Com......
  • String interpolation using $
    The$characteridentifiesastringliteralasaninterpolatedstring.Aninterpolatedstringisastringliteralthatmightcontaininterpolationexpressions.Whenaninterpolatedstringisresolvedtoaresultstring,thecompilerreplacesitemswithin......
  • 【C++】string类(1)
    ......
  • java 11天 StringBuffer static
    补充:1--100正则表达式1-100 100拿出去或上“[1-9][0-9]{0,1}|100”0--100  0和100拿出去或上“[1-9][0-9]{0,1}|100|0”获取常量池中的地址 String - intern();String学过23个 一.StringBufferStringBuffer 字符串长度+16 StringBuffer空间是2*oldCap......
  • C++ -string -常见用法2
    博客主页:【夜泉_ly】本文专栏:【C++】欢迎点赞......
  • BigDecimalUtil工具类 Java 多种类型(Double, String, Integer)转换成BigDecimal 进行加
    工具说明没有什么太复杂的代码。先是通过方法名称确定返回值的类型(BigDecimal、Double、String)。然后大量的重载方法,用“穷举法”把BigDecimal、Double、String、Integer四种类型进行各种形式的两两组合,进行加减乘除运算。运算时非BigDecimal类型的参数会转化成BigDecim......
  • java 第10天 String创建以及各类常用方法
    一.String创建的两种形式1.通过new的当时Stringstr=newString();2.不new的方式 Strings1="";二.new和不new的方式的区别是什么不new创建的字符串首先是拿着值去常量池中查找,是否有该内容,有就用常量池该字符串的地址,没有的话在常量池中创建并使用new的方式创建的字......
  • 【MySQL】[HY000][1366] Incorrect string value: ‘\xE4\xB8\xA4\xE6\x95\xB0.
    问题描述在导入中文数据时遇到错误。[2024-10-1610:49:49][HY000][1366]Incorrectstringvalue:'\xE4\xB8\xA4\xE6\x95\xB0...'forcolumn'title'atrow1尝试将某些数据插入到名为’title’的列时,遇到了不正确的字符串值。原因分析MySQL5.7创建数据库的默......