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”的空指针
解决办法
- 使用malloc动态分配空间
char * a = (char * ) malloc(sizeof (char) * len);
- 使用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
解决办法
使用动态规划分配存储空间