C/C++算法实战练习

编程狂想曲 2024-09-10 ⋅ 9 阅读

在学习C/C++编程语言时,算法实战练习是非常重要的一部分。通过解决不同的算法问题,我们可以提高自己的编码能力,加深对数据结构和算法的理解。本篇博客将为大家介绍一些经典的算法练习题目,并提供相应的解答。

1. 两数之和

给定一个整数数组 nums 和一个目标值 target,请从数组中找出两个数,使它们的和等于目标值。假设每个输入只对应一个答案,且同样的元素不能被重复利用。

示例:

输入: nums = [2, 7, 11, 15], target = 9
输出: [0, 1]
解释: 因为 nums[0] + nums[1] = 2 + 7 = 9, 所以返回 [0, 1]。

解答:

主要思路是使用哈希表(HashMap)来存储数组元素及其下标,遍历数组并检查哈希表中是否存在目标元素的差值,如果存在则返回对应的下标,如果不存在则将当前元素存入哈希表中。

以下是基于C++实现的解答:

#include <vector>
#include <unordered_map>

class Solution {
public:
    std::vector<int> twoSum(std::vector<int>& nums, int target) {
        std::unordered_map<int, int> hashMap;
        for (int i = 0; i < nums.size(); i++) {
            int complement = target - nums[i];
            if (hashMap.find(complement) != hashMap.end()) {
                return {hashMap[complement], i};
            }
            hashMap[nums[i]] = i;
        }
        return {};
    }
};

2. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

示例:

输入: ["h","e","l","l","o"]
输出: ["o","l","l","e","h"]

解答:

该问题可以通过双指针法来解决,即分别指向字符串的起始位置和末尾位置,并将两个指针指向的字符交换。

以下是基于C++实现的解答:

#include <vector>

class Solution {
public:
    void reverseString(std::vector<char>& s) {
        int left = 0;
        int right = s.size() - 1;
        while (left < right) {
            std::swap(s[left], s[right]);
            left++;
            right--;
        }
    }
};

3. 删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.

解答:

该问题可以通过快慢指针法来解决,首先让快指针向前移动 n+1 个节点,然后让快慢指针同时向前移动,直到快指针到达链表末尾。此时慢指针所指向的节点就是要删除的节点的前驱节点,将其指向下下个节点即可。

以下是基于C++实现的解答:

class ListNode {
public:
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummy = new ListNode(0);
        dummy->next = head;
        ListNode* fast = dummy;
        ListNode* slow = dummy;
        
        for (int i = 0; i <= n; i++) {
            fast = fast->next;
        }
        
        while (fast != nullptr) {
            fast = fast->next;
            slow = slow->next;
        }
        
        ListNode* toDelete = slow->next;
        slow->next = slow->next->next;
        delete toDelete;
        
        return dummy->next;
    }
};

上述内容只是算法实战练习题目的一小部分,C/C++编程语言涵盖了许多经典的算法问题。通过不断练习和解决这些问题,我们可以提升自己的编码能力,为日后遇到更复杂的问题打下坚实的基础。希望上述内容对大家有所帮助,谢谢阅读!


全部评论: 0

    我有话说: