剑指offer:18-21记录
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
注意:此题对比原题有改动
示例 1:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
说明:
题目保证链表中节点的值互不相同
若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
思路:注意头结点即可,制造一个假节点解决问题是常用方法。
-
/**
-
* Definition for singly-linked list.
-
* public class ListNode {
-
* int val;
-
* ListNode next;
-
* ListNode(int x) { val = x; }
-
* }
-
*/
-
class Solution {
-
public ListNode deleteNode(ListNode head, int val) {
-
ListNode temp=new ListNode(-1);
-
temp.next=head;
-
for(ListNode i=temp;i.next!=null;i=i.next){
-
if(i.next.val==val){
-
i.next=i.next.next;
-
break;
-
}
-
}
-
return temp.next;
-
}
-
}
请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。
示例 1:
输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:
s = "aa"
p = "a*"
输出: true
解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3:
输入:
s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
示例 4:
输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
示例 5:
输入:
s = "mississippi"
p = "mis*is*p*."
输出: false
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
思路:字符串dp,注意仔细读题。
-
class Solution {
-
public boolean isMatch(String s,String p){
-
if (s == null || p == null)return false;
-
int sLen=s.length();
-
int pLen=p.length();
-
boolean[][] dp = new boolean[sLen + 1][pLen + 1];
-
dp[0][0] = true;//dp[i][j] 表示 s 的前 i 个是否能被 p 的前 j 个匹配
-
for (int i = 0; i < pLen; i++) { // here's the p's length, not s's
-
dp[0][i + 1] = p.charAt(i) == '*' && dp[0][i - 1];
-
}
-
for (int i = 0; i < sLen; i++) {
-
for (int j = 0; j < pLen; j++) {
-
//单个字符可以匹配
-
if (p.charAt(j) == '.' || p.charAt(j) == s.charAt(i)) dp[i + 1][j + 1] = dp[i][j];
-
//多个字符
-
if (p.charAt(j) == '*') {
-
dp[i+1][j+1]=dp[i+1][j-1] ||
-
(dp[i+1][j] && (s.charAt(i)==p.charAt(j-1) || p.charAt(j-1)=='.')) ||
-
(dp[i][j+1] && (s.charAt(i)==p.charAt(j-1) || p.charAt(j-1)=='.'));
-
}
-
}
-
}
-
return dp[sLen][pLen];
-
}
-
}
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"及"-1E-16"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。
思路1:try catch
-
class Solution {
-
public boolean isNumber(String s) {
-
try {
-
if (s.endsWith("f") || s.endsWith("F")
-
|| s.endsWith("D") || s.endsWith("d")) {
-
return false;
-
}
-
Double.valueOf(s);
-
return true;
-
} catch (Exception exception) {
-
return false;
-
}
-
}
-
}
思路2:正则
-
class Solution:
-
def isNumber(self, s: str) -> bool:
-
return bool(re.match(r' *[+-]?([0-9]+(\.[0-9]*)?|\.[0-9]+)(e[+-]?[0-9]+)? *$', s))
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
1 <= nums.length <= 50000
1 <= nums[i] <= 10000
思路:和快排一趟partation类似
-
class Solution {
-
public int[] exchange(int[] nums) {
-
int i = 0, j = nums.length - 1, tmp;
-
while(i < j) {
-
while(i < j && (nums[i] & 1) == 1) i++;
-
while(i < j && (nums[j] & 1) == 0) j--;
-
tmp = nums[i];
-
nums[i] = nums[j];
-
nums[j] = tmp;
-
}
-
return nums;
-
}
-
}
文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。
原文链接:fantianzuo.blog.csdn.net/article/details/104757554
- 点赞
- 收藏
- 关注作者
评论(0)