下面是一份关于【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++ 笔试题、算法题解析或专题讲解,随时告诉我!
发表回复