开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情
前言: 小编分享每日解题心得,有助于自己以后的复习,也希望能让每位读者读完后都有一点心得。
1、斐波那契数列:
题目要求:写一个函数,输出第n项斐波那契数列。
**首先我们看题目要求的数据范围是0到30, 表示int类型足够了,再看n = 5时,输出的也是5, 说明改斐波那契数列是 0 1 1 2 3 5,所以我们可以根据斐波那契数列的递推公式:f(n) = f(n - 1) + f(n - 2)求得答案。
class Solution {
public:
int Fibonacci(int n) {
int a = 0, b = 1;//首项为0
while(n --)进行n次替换
{
int c = a + b;
a = b, b = c;
}
return a;
}
};
方法2:递归实现
class Solution {
public:
int Fibonacci(int n) {
if(n <= 1) return n;
else return Fibonacci(n-1) + Fibonacci(n-2);
}
};
2、替换空格
题目要求:实现一个函数,把字符串中的每个空格替换成"%20"
class Solution {
public:
string replaceSpaces(string &str) {
string res;//定义一个新字符串
for(auto c : str)//auto枚举字符串str
if(c == ' ')
res += "%20";
else
res += c;
return res;
}
};
3、在O(1)时间删除链表结点
题目要求:
给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。
假设链表一定存在,并且该节点一定不是尾节点。
class Solution {
public:
void deleteNode(ListNode* node) {
node->val = node->next->val;//用下一个节点的值把我当前的值覆盖掉
node->next = node->next->next;//再把下个节点删掉
}
};
4、合并两个排序的链表
题目要求:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
输入:1->3->5 , 2->4->5
输出:1->2->3->4->5->5
class Solution {
public:
ListNode* merge(ListNode* l1, ListNode* l2) {
auto dummy = new ListNode(-1);
auto cur = dummy;//记录当前尾节点的地址
while(l1 && l2)//两个指针来遍历两个链表
{
if(l1->val < l2->val)//每次找当前两个链表中较小值
{
cur->next = l1;//那个值更小就放在新链表cur后面
cur = l1;
l1 = l1->next;
}
else
{
cur->next = l2;
cur = l2;
l2 = l2->next;
}
}
if(l1) cur->next = l1;//哪个不为空则接到最后一个
else cur->next = l2;
return dummy->next;
}
};
5、左旋转字符串
题目要求:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
请定义一个函数实现字符串左旋转操作的功能。
比如输入字符串"abcdefg"和数字 22,该函数将返回左旋转 22 位得到的结果"cdefgab"。
输入:"abcdefg" , n=2
输出:"cdefgab"
题目分析:字符串旋转是我们初学编程时常常遇到的“难题”, 虽然知道后面写C++时有库函数reverse,写这种题目会比较方便,但是我们还是得学会怎么来实现一个旋转字符串的函数, 普通的reverse函数是通过定义一个left和right指针,只要left <= right 交换字符串left和right位置,直到left ==right时,就结束,下面写的是利用字符串拼接函数substr来实现的。
方法1:利用函数substr
class Solution {
public:
string leftRotateString(string str, int n) {
while(n --)
{
str = str.substr(1)+str[0];//每次把字符串首位接到字符串末尾,接n次
}
return str;
}
};
方法2:利用reverse函数
class Solution {
public:
string leftRotateString(string str, int n) {
reverse(str.begin(),str.end());//先逆置全部
reverse(str.begin(), str.begin()+str.size() -n);再分别逆置每个部分
reverse(str.begin()+str.size()-n, str.begin()+str.size());
return str;
}
};
总结
本文总共写了五道常见题的题解和分析,包括斐波那契数列,左旋转字符串等等,希望大家读后能够有所收获。