题目链接:力扣
题目描述:输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
- 输入: n = 1
- 输出: [1,2,3,4,5,6,7,8,9]
题目解析:这道题很简单,求出10的n次方,然后遍历存到数组中就行了。
解题代码:
- class Solution {
-
- public:
-
- vector<int> printNumbers(int n) {
- vector<int> res;
- for(int i=1;i<pow(10,n);i++){
- res.push_back(i);
- }
- return res;
- }
-
- };
题目链接:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
示例 1:
- 输入: head = [4,5,1,9], val = 5
- 输出: [4,1,9]
- 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
解题思路:线性扫描,直到扫描到val,删除掉该节点,要注意首元素的val等于val的情况
时间复杂度:O(n)
解题代码:
- /**
- * Definition for singly-linked list.
- * struct ListNode {
- * int val;
- * ListNode *next;
- * ListNode(int x) : val(x), next(NULL) {}
- * };
- */
- class Solution {
- public:
- ListNode* deleteNode(ListNode* head, int val) {
- ListNode* p = head;
- if(head->val == val) return head->next;
- while(p->next&&p->next->val!=val) p = p->next;
- p->next = p->next->next;
- return head;
- }
- };
题目链接:力扣
题目描述:请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。
解题思路:动态规划
状态表示:f[i][j]表示p从j开始到结尾,是否能匹配s从i开始到结尾
状态转移:
- 如果p[j+1]不是通配符'*',则f[i][j]是真,当且仅当s[i]可以和p[j]匹配,且f[i+1][j+1]是真;
- 如果p[j+1]是通配符'*',则下面的情况只要有一种满足,f[i][j]就是真;
- f[i][j+2]是真;
- s[i]可以和p[j]匹配,且f[i+1][j]是真;
解题代码:
- class Solution {
- public:
- vector
int>>f; - int n, m;
- bool isMatch(string s, string p) {
- n = s.size();
- m = p.size();
- f = vector
int>>(n + 1, vector<int>(m + 1, -1)); - return dp(0, 0, s, p);
- }
-
- bool dp(int x, int y, string &s, string &p)
- {
- if (f[x][y] != -1) return f[x][y];
- if (y == m)
- return f[x][y] = x == n;
- bool first_match = x < n && (s[x] == p[y] || p[y] == '.');
- bool ans;
- if (y + 1 < m && p[y + 1] == '*')
- {
- ans = dp(x, y + 2, s, p) || first_match && dp(x + 1, y, s, p);
- }
- else
- ans = first_match && dp(x + 1, y + 1, s, p);
- return f[x][y] = ans;
- }
- };
-