每日一练<3>

每日一练

大家好呀!我是小笙,接下来分享下10月份每日一题的解题思路~

1441. 用栈操作构建数组

给你一个数组 target 和一个整数 n。数组 target 是严格递增的,并且只包含 1n 之间的数字

从 1 遍历到 n,如果在 target 数组中,则添加 “Push” 反之添加 “Push” “Pop”

示例

输入:target = [1,3], n = 3
输出:["Push","Push","Pop","Push"]
解释: 
读取 1 并自动推入数组 -> [1]
读取 2 并自动推入数组,然后删除它 -> [1]
读取 3 并自动推入数组 -> [1,3]

暴力解决

class Solution {
   
    public List<String> buildArray(int[] target, int n) {
   
        List<String> res = new ArrayList<>();
        int index = 0;
        for(int i=1;i<=n;i++){
   
            if(index >= target.length){
   
                return res;
            }else if(target[index] == i){
   
                index++;
                res.add("Push");
            }else{
   
                res.add("Push");
                res.add("Pop");
            }
        }
        return res;
    }
}
779. 第K个语法符号

我们构建了一个包含 n 行( 索引从 1 开始 )的表。首先在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为011替换为10

image-20221020201515269

示例

输入: n = 1, k = 1
输出: 0
解释: 第一行:0

解题思路:首先,我们需要寻找规律,这道题很容易出现空间的溢出或者时间的超时

规律:下一行数据 = 上一行数据 + 上一行数据的反转(0 替换成 1;1 替换成 0)

所以我想我可以通过第一行的数据来推导出接下来每一行的数据,因为都是第一行数据演变过来的

回推的时候,k 有两种情况:

  • k 是在 n 行的前半段,意味着他就是上一行的第 k 个数据,也就是没有进行反转
  • 如果 k 出现在第 n 行数据后半段的时候,那折半处理的时候就会进行反转一次(0 替换成 1;1 替换成 0)
  • 因此,我只要记录下反转的次数不就可以直接推出第 n 行第 k 个数据是多少了嘛
class Solution {
   
    public int kthGrammar(int n, int k) {
   
        // 反转次数
        int inverse = 0;
        while(n > 1){
   
            if(k > (int)(Math.pow(2,n-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗念笙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值