算法题目分享

76 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

输入一个整数 n ,求斐波那契数列的第 n 项。

斐波那契数列

假定从 0 开始,第 0 项为 0。

数据范围
0≤n≤39
样例
输入整数 n=5

返回 5
题目分析:简单介绍一下这题面试中常考的题目斐波那契数列,首先简单介绍一下斐波那契数列是什么:

a0=0,a1=1,an=an−1+an−2,求an是多少

我们可以看到这题的数据范围非常小,可以直接用复杂度为O(n)的递推来做
具体解法:先定义两个变量a,b,分别表示第n−1项和第n项。且定义c=a+b来表示第 n+1项,然后让a,b滚动地顺次往后移一位(滚动数组解法)

class Solution {
public:
    int Fibonacci(int n) {
        int a=0,b=1;
        while(n--)
        {
            int c=a+b;
            a=b,b=c;
        }
        return a;
    }
};

替换空格

请实现一个函数,把字符串中的每个空格替换成"%20"。

数据范围
0≤ 输入字符串的长度 ≤1000。
注意输出字符串的长度可能大于 1000。

样例
输入:“We are happy.”

输出:“We%20are%20happy.”
题目分析:

这题用C++做会很方便,我们可以从前往后枚举原字符串; 如果遇到空格,则在string类型的答案中添加"%20"; 如果遇到其他字符,则直接将它添加在答案中;

class Solution {
public:
    string replaceSpaces(string &str) {
        string res;
        for(auto x:str)
            if (x==' ')
                res+="%20";
            else
                res+=x;
        return res;
    }
};

求1+2+…+n

求 1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句 (A?B:C)。

数据范围
1≤n≤1000。

样例
输入:10

输出:55
题目分析:

(递归) 时间复杂度O(n) 这题最直接的想法就是用递归,sum(n)=n+sum(n-1), 但是要注意终止条件,由于求的是1+2+…+n的和, 所以需要在n=0的时候跳出递归,但是题目要求不能使用if,while等分支判断, 所以可以考虑利用&&短路特性运算来终止判断。

class Solution {
public:
    int getSum(int n) 
    {
        int res=n;
        n>0&&(res+=getSum(n-1));
        return res;
    }
};