LeetCode练习题509、1137、125

509.斐波那契数

斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
给定 N,计算 F(N)。

示例 1:
输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1.

示例 2:
输入:3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2.

示例 3:
输入:4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3.

提示:
0 ≤ N ≤ 30

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fibonacci-number

方法一:一个for循环搞定。

int fib(int N){
    int a = 0 , b = 1,c;
    int i;
    if (N < 2) {
        return N;
    }
    for (i = 2 ; i <= N ; i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return c;
}

方法二:递归

int fib(int N){
    if (N < 2) {
        return N;
    }
    return fib(N - 2) + fib(N - 1);
}

两种方法 耗时差不多

1137.第N个泰波那契数

泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

示例 1:
输入:n = 4
输出:4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4

示例 2:
输入:n = 25
输出:1389537

提示:
0 <= n <= 37
答案保证是一个 32 位整数,即 answer <= 2^31 - 1。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-th-tribonacci-number

方法一:利用for循环

int tribonacci(int n) {
    int a = 0 , b = 1 , c = 1 ;
    int x = 1, i ;
    if (n < 2) {
        return n;
    }
    for (i = 2 ; i < n ; i++) {
        x = a + b + c ;
        a = b ; 
        b = c ;
        c = x ;
    }
    return x ;
}

方法二:递归 超出时间限制,不能提交

int tribonacci(int n) {
    int a = 0 , b = 1 , c = 1 ;
    int x = 1, i ;
    if (n < 2) {
        return n;
    }
    if (n == 2) {
        return 1;
    }
    return tribonacci (n-3) + tribonacci (n-2) + tribonacci (n-1);
}

总结以上两题,尽量少用递归。

125.验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true

示例 2:
输入: “race a car”
输出: false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome

解题思路:去掉空格和字符,大小写统一,最后在用双指针比较。

bool isPalindrome(char * s) {
    int i = 0 , j = 0;
    int len = strlen(s);
    char * a = (char * ) malloc(sizeof (char) * len);
    for (i = 0 ; i< len ; i++) {
        if (s[ i ] >= 'A'&&s[ i ] <= 'Z') {
        s[ i ] = s[ i ]+32;
        a[ j++ ] = s[ i ];
        }
        else if (s[ i ] >= '0'&&s[ i ] <= '9' || s[ i ] >= 'a'&&s[ i ] <= 'z') {
        a[ j++ ] = s[ i ];
        }
    }
    for ( int i = 0; i < (j/2); i ++) {
        if (a[i] != a[j-i-1]) {
            return false;
        }
    }
    return true;
}
遇到的问题一

runtime error: store to null pointer of type ‘char’
运行时错误:存储到类型为“char”的空指针
解决办法

  1. 使用malloc动态分配空间
char * a = (char * ) malloc(sizeof (char) * len);
  1. 使用static静态定义数组
遇到的问题二

runtime error: index -1 out of bounds for type ‘char [100000]’
运行时错误:索引-1超出了“char[100000]类型”的界限

使用变量来动态控制数组大小,事先定义一个变量,通过用户的输入来决定这个数组到底有多大,这样避免了内存空间的浪费或者索引超出数组界限的情况出现。

由于把len=10000了,出现了问题二的错误
于是我又把len=30,又出现了问题三的错误

遇到的问题三

AddressSanitizer: heap-buffer-overflow on address
地址Sanitizer:地址上的堆缓冲区溢出

问题二与问题三的解决办法
调用strlen()函数

#include <stdio.h>
#include <string.h>
int main(){
    char str[100] = { 0 };
    size_t len;
    gets(str);
    len = strlen(str);
    printf("Length: %d\n", len);
    return 0;
}

重重困难,重于提交成功了。🤦‍♀️

今天重新做 又遇到了错误😥

遇到的问题四

Line 4: Char 10: runtime error: variable length array bound evaluates to non-positive value 0 (solution.c)
可变长度数组bound的计算结果为non

解决办法
使用动态规划分配存储空间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值