LeetCode练习题779、283

779.第K个语法符号

在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。
给定行数 N 和序数 K,返回第 N 行中第 K个字符。(K从1开始)

例子:

输入: N = 1, K = 1
输出: 0

输入: N = 2, K = 1
输出: 0

输入: N = 2, K = 2
输出: 1

输入: N = 4, K = 5
输出: 1

解释:
第一行: 0
第二行: 01
第三行: 0110
第四行: 01101001

注意:
N 的范围 [1, 30].
K 的范围 [1, 2^(N-1)].

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/k-th-symbol-in-grammar
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一:按列找规律

  1. 第1列的数字为0。
  2. 当列数是偶数列时,该列的数值和K/2列的数值相反。
  3. 当列数是奇数列时,该列的数值和(K+1)/2列的数值相同。
int kthGrammar(int N, int K){
    if (K==1) {
        return 0;
    }
    if (K % 2 == 0) {
        return !kthGrammar(N , K/2);
    }
    else {
        return kthGrammar(N , (K+1)/2);
    }
}

方法二:按行找规律

  1. 第一行的长度为2^0 ,第二行的长度为2^1,……则第 N 行的长度为 2^(N-1)。
  2. 若 K <= N 行长度的一半 时,K等于 N - 1 行的第 K 个数。
  3. 若 K>N 行长度的一半时,K等于 N - 1 行的第( K - 行长度一半) 个数取反。
int kthGrammar(int N, int K){
    int i;
    if (N == 1) {
        return 0;
    }
    if (N == 2) {
        if (K == 1) {
            return 0;
        }
        else {
            return 1;
        }
    }
    int L = 1;
    for (i = 1 ; i < N ; i++) {
        L *= 2;
    }
    if (K <= (L/2)) {
        return kthGrammar(N - 1 , K);
    }
    else {
        return !kthGrammar(N - 1 , K-(L/2));
    }
}

第一种方法更简单些,但实际情况更会考虑到方法二。

283.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:
1.必须在原数组上操作,不能拷贝额外的数组。
2.尽量减少操作次数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法一:遇到非零就放前面,后面补零

void moveZeroes(int* nums, int numsSize){
    int i, j = 0;
    for (i = 0; i < numsSize; i++) {
        if (nums[i] != 0) {
            nums[j++] = nums[i];
        }
    }
    for (j; j < numsSize; j++) {
        nums[j] = 0;
    }
}

方法二:将数组中所有零放在一起,去掉,补在后面

void moveZeroes(int* nums, int numsSize){
    int i, t = 0;
    for (i = 0; i < numsSize; i++) {
        if (nums[i] == 0){
            t++; 
        }
        else if (t > 0) {
         nums[i - t] = nums[i];
         nums[i] = 0;        
        }
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode一个著名的在线编程题库,可以帮助计算机程序员提升编程能力。LeetCode的题目涵盖了算法、数据结构、字符串、数组、链表等多个方面的知识,对于求职面试以及算法竞赛准备非常有帮助。 LeetCode上的编程题目分为简单、中等和困难三个难度级别。每个题目都有详细的题目描述、输入输出示例以及参考答案等内容。在解决每个问题时,我们需要仔细阅读题目,并根据题目要求提供正确的解答。 通常,我们需要使用编程语言如Python、C++等来实现解题思路。在编码之前,我们需要先分析问题,并找到合适的算法或数据结构来解决问题。一般来说,我们可以使用递归、迭代、动态规划等方法来解决常见的编程问题。 在LeetCode上,我们可以提交解答,并测试解答是否通过了所有的测试用例。如果通过了所有的测试用例,我们就可以得到题目的AC(Accepted)结果,并获得该题目的通过证书。如果没有通过所有的测试用例,我们可以检查自己的解答,查找解答中的错误或者不完善之处,并进行修改和优化。 总之,LeetCode编程题是一个优秀的学习和练习编程的平台。通过解答LeetCode上的编程题目,我们可以提升自己的编程能力,并且培养解决问题的思维方式。无论是求职面试还是算法竞赛,LeetCode编程题都是非常有帮助的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值