Leetcode - 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:
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
示例 2:
输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2
示例 3:
输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
方法一、递归
int fib(int n) { //0或1返回0或1 if (n <= 1) return n; //2返回1 else if (n == 2) return 1; //大于2的数返回前两个数之和 else return fib(n - 1) + fib(n - 2); }
方法二、动态规划
int fib(int n) { //0返回0 if (n == 0) return 0; //从第三位开始等于前两项的和,迭代往后走 int p = 0, q = 0, r = 1; for (int i = 2; i <= n; i++) { p = q; q = r; r = p + q; } return r; }
如图所示,相加完后迭代往后走;
Leetcode - 520.检测大写字母
题目:我们定义,在以下情况时,单词的大写用法是正确的:
全部字母都是大写,比如 “USA” 。
单词中所有字母都不是大写,比如 “leetcode” 。
如果单词不只含有一个字母,只有首字母大写, 比如 “Google” 。
给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。
示例 1:
输入:word = “USA”
输出:true
示例 2:
输入:word = “FlaG”
输出:false
思路是直接遍历字符串,首先判断第一个字母是否是大写字母,如果是,将flag标记为1,再遍历剩下的字母,统计大写字母的个数;最后判断只有一个大写字母且是第一个字母大写,或者全是小写字母,或者全是大写字母,符合其中一个就返回true,否则返回false;
bool detectCapitalUse(char* word) { //只有一个字母,返回true if (strlen(word) == 1) return true; //flag记录第一个是大写字母,是大写字母的话改成1 //uppercase记录大写字母的个数 int flag = 0, uppercase = 0; if (word[0] >= 'A' && word[0] <= 'Z') flag = 1; //遍历字符串,统计大写字母数量 for (int i = 0; i < strlen(word); i++) { if (word[i] >= 'A' && word[i] <= 'Z') uppercase++; } //最后判断只有首字母大写,或者全是大写字母,或者uppercase等于0,即全是小写字母,其中一个为1,就返回true if (uppercase == 1 && flag || uppercase == strlen(word) || !uppercase) return true; //否则返回false return false; }