入门必刷4题:算法面试轻松拿下
一、今天学习目标
拿下4 道入门必考题,简单、高频、好拿分:
- 两数之和
- 反转单链表
- 合并两个有序链表
- 有效的括号
1)两数之和
给定数组与目标值,找到两个数下标和为 target。
思路:暴力双重循环(入门版)
#include <stdio.h> void twoSum(int* nums, int n, int target) { for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (nums[i] + nums[j] == target) { printf("%d %d\n", i, j); return; } } } } int main() { int nums[] = {2, 7, 11, 15}; twoSum(nums, 4, 9); // 输出 0 1 return 0; }2)反转单链表(迭代版)
三指针:prev、cur、next,逐个翻转方向。
struct ListNode { int val; struct ListNode *next; }; struct ListNode* reverseList(struct ListNode* head) { struct ListNode *prev = NULL, *cur = head, *next; while (cur) { next = cur->next; cur->next = prev; prev = cur; cur = next; } return prev; }3)合并两个有序链表
类似归并排序的 merge,谁小取谁。
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { if (!l1) return l2; if (!l2) return l1; if (l1->val < l2->val) { l1->next = mergeTwoLists(l1->next, l2); return l1; } else { l2->next = mergeTwoLists(l1, l2->next); return l2; } }4)有效的括号(栈)
左括号入栈,右括号匹配栈顶。
#include <stdbool.h> #include <string.h> bool isValid(char* s) { char stack[10000]; int top = -1; int len = strlen(s); for (int i = 0; i < len; i++) { char c = s[i]; if (c == '(') stack[++top] = ')'; else if (c == '[') stack[++top] = ']'; else if (c == '{') stack[++top] = '}'; else { if (top < 0 || stack[top] != c) return false; top--; } } return top == -1; }二、今日小练习
- 对数组
[3,2,4],target=6,求两数之和下标 - 链表
1→2→3→4反转后结果 - 验证
"{[]}"和"{[)]}"是否合法
答案:
- 1 2
- 4→3→2→1
- 合法 / 不合法
