下面是一份关于【C++ 笔试刷题 day_29】的示范内容,包含题目、详细分析与代码实现,适合面试和笔试复习使用:


【C++】笔试刷题 Day 29


题目 1:实现字符串反转函数

题目描述:
编写一个函数,实现字符串的反转。要求不使用额外的字符串空间,直接在原字符串上操作。

示例:
输入:”hello”
输出:”olleh”

题解思路:

  • 采用双指针,分别指向字符串开头和结尾。
  • 交换两个指针所指字符,指针向中间移动,直到相遇。
  • 时间复杂度 O(n),空间复杂度 O(1)。

代码实现:

#include <iostream>
#include <string>

void reverseString(std::string& s) {
    int left = 0, right = s.size() - 1;
    while (left < right) {
        std::swap(s[left], s[right]);
        left++;
        right--;
    }
}

int main() {
    std::string str = "hello";
    reverseString(str);
    std::cout << str << std::endl; // 输出:olleh
    return 0;
}

题目 2:合并两个有序链表

题目描述:
给定两个升序链表,合并为一个新的升序链表并返回。

题解思路:

  • 使用双指针遍历两个链表,比较节点大小依次插入新链表。
  • 使用哨兵节点简化代码逻辑。
  • 时间复杂度 O(m+n),空间复杂度 O(1)。

代码实现:

#include <iostream>

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

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    ListNode dummy(0);
    ListNode* tail = &dummy;

    while (l1 && l2) {
        if (l1->val < l2->val) {
            tail->next = l1;
            l1 = l1->next;
        } else {
            tail->next = l2;
            l2 = l2->next;
        }
        tail = tail->next;
    }
    tail->next = l1 ? l1 : l2;
    return dummy.next;
}

// 测试用例请自行构造链表节点

题目 3:判断一个数是否是回文数

题目描述:
判断一个整数是否是回文数。
要求不使用额外空间。

题解思路:

  • 反转整数一半数字,判断两半是否相等。
  • 注意负数和末尾为0(非0的数字)特殊情况。

代码实现:

#include <iostream>

bool isPalindrome(int x) {
    if (x < 0 || (x % 10 == 0 && x != 0)) return false;
    int reverted = 0;
    while (x > reverted) {
        reverted = reverted * 10 + x % 10;
        x /= 10;
    }
    return x == reverted || x == reverted / 10;
}

int main() {
    int n = 121;
    std::cout << (isPalindrome(n) ? "是回文数" : "不是回文数") << std::endl;
    return 0;
}

如果你想要我继续帮你整理更多的 C++ 笔试题、算法题解析或专题讲解,随时告诉我!