Re: [闲聊] 每日LeetCode

楼主: Rushia (みけねこ的鼻屎)   2023-10-25 14:29:47
https://leetcode.com/problems/k-th-symbol-in-grammar/description
779. K-th Symbol in Grammar
给你一个数字 n 和一个数字 k,n 表示第几列 k 表示第几行(列和行从 1 开始)
第一列的数字固定为 0,第一列之后的数字按照以下规律:
取代前一列的所有 0 -> 01 取代前一列的所有 1 -> 10
Example:
n = 3,则
ROW1=0
ROW2=01
ROW3=0110
求出第 n 列的第 k 个数字是多少。
思路:
1.题目的测资范围 n 最大为30,如果我们一个一个转换数字的话会产生一个 2^30
长度的值,int 长度不够,存到 string 的话内存会超出限制,我们必须找到
一个方法看能不能不找出整个字串但却可以知道他指定位置的数字。
2.因为每一个数字在下一列可以产生两个数字,所以我们可以把问题转为一个完满
二元树,当 n = 3 的时候树如下所示:
0
/ \
0 1
/ \ / \
0 1 1 0
3.观察图形,发现一个规律,一个位置是 1 还是 0 取决于:
(1) 这个位置是左子节点还是右子节点。
(2) 这个位置的父节点值。
如果当前节点是左子节点,那他就和他的父节点编号相同。
如果当前节点是右子节点,那他就和他的父节点编号相反。
4.所以我们要从指定层数的节点往上找出当前点的父节点值是什么,找父节点的方式
可以写成递回关系式去找,因为他是一个完满二元树,所以要判断当前点是左还是
右子节点可以用 (k + 1)/2 去判断,如果为奇数就表示为左子节点反之为右。
Java Code:
作者: NTHUlagka (拉卡)   2023-10-25 15:23:00
大师

Links booklink

Contact Us: admin [ a t ] ucptt.com