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 
#include 
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

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

你可能感兴趣的:(LeetCode练习题)