給定單向鏈表的頭指針和一個要刪除的節點的值,定義一個函數刪除該節點。
返回刪除后的鏈表的頭節點。
注意:此題對比原題有改動
示例 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'sdp[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;}
}
?