(C/C++)语法入门解题报告:结构体、类、指针、引用

简介: (C/C++)语法入门解题报告:结构体、类、指针、引用

1、斐波那契数列


题目要求:写一个函数,输出第n项斐波那契数列。


1669436152766.jpg


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"

1669436177447.jpg

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)时间删除该结点。


假设链表一定存在,并且该节点一定不是尾节点。

1669436199317.jpg

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"

方法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;
    }
};


总结:让我们一起加油,我们会成为下一个大牛!

相关文章
|
2天前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
42 30
|
16天前
|
C++
C++(十六)类之间转化
在C++中,类之间的转换可以通过转换构造函数和操作符函数实现。转换构造函数是一种单参数构造函数,用于将其他类型转换为本类类型。为了防止不必要的隐式转换,可以使用`explicit`关键字来禁止这种自动转换。此外,还可以通过定义`operator`函数来进行类型转换,该函数无参数且无返回值。下面展示了如何使用这两种方式实现自定义类型的相互转换,并通过示例代码说明了`explicit`关键字的作用。
|
16天前
|
存储 设计模式 编译器
C++(十三) 类的扩展
本文详细介绍了C++中类的各种扩展特性,包括类成员存储、`sizeof`操作符的应用、类成员函数的存储方式及其背后的`this`指针机制。此外,还探讨了`const`修饰符在成员变量和函数中的作用,以及如何通过`static`关键字实现类中的资源共享。文章还介绍了单例模式的设计思路,并讨论了指向类成员(数据成员和函数成员)的指针的使用方法。最后,还讲解了指向静态成员的指针的相关概念和应用示例。通过这些内容,帮助读者更好地理解和掌握C++面向对象编程的核心概念和技术细节。
|
16天前
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
|
1月前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
32 0
|
16天前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)
|
1月前
|
存储 安全 编译器
【C++】类和对象(下)
【C++】类和对象(下)
【C++】类和对象(下)
|
29天前
|
存储 算法 编译器
c++--类(上)
c++--类(上)
|
1月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
1月前
|
编译器 C++
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决