剑指offer:18-21记录
給定單向鏈表的頭指針和一個要刪除的節(jié)點的值,定義一個函數(shù)刪除該節(jié)點。
返回刪除后的鏈表的頭節(jié)點。
注意:此題對比原題有改動
示例 1:
輸入: head = [4,5,1,9], val = 5
輸出: [4,1,9]
解釋: 給定你鏈表中值為?5?的第二個節(jié)點,那么在調(diào)用了你的函數(shù)之后,該鏈表應(yīng)變?yōu)?4 -> 1 -> 9.
示例 2:
輸入: head = [4,5,1,9], val = 1
輸出: [4,5,9]
解釋: 給定你鏈表中值為?1?的第三個節(jié)點,那么在調(diào)用了你的函數(shù)之后,該鏈表應(yīng)變?yōu)?4 -> 5 -> 9.
?
說明:
題目保證鏈表中節(jié)點的值互不相同
若使用 C 或 C++ 語言,你不需要 free 或 delete 被刪除的節(jié)點
思路:注意頭結(jié)點即可,制造一個假節(jié)點解決問題是常用方法。
/*** 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;} }請實現(xiàn)一個函數(shù)用來匹配包含'. '和'*'的正則表達(dá)式。模式中的字符'.'表示任意一個字符,而'*'表示它前面的字符可以出現(xiàn)任意次(含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' 重復(fù)了一次。
示例?3:
輸入:
s = "ab"
p = ".*"
輸出: true
解釋:?".*" 表示可匹配零個或多個('*')任意字符('.')。
示例 4:
輸入:
s = "aab"
p = "c*a*b"
輸出: true
解釋:?因為 '*' 表示零個或多個,這里 'c' 為 0 個, 'a' 被重復(fù)一次。因此可以匹配字符串 "aab"。
示例 5:
輸入:
s = "mississippi"
p = "mis*is*p*."
輸出: false
s?可能為空,且只包含從?a-z?的小寫字母。
p?可能為空,且只包含從?a-z?的小寫字母,以及字符?.?和?*。
思路:字符串dp,注意仔細(xì)讀題。
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];} }請實現(xiàn)一個函數(shù)用來判斷字符串是否表示數(shù)值(包括整數(shù)和小數(shù))。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"及"-1E-16"都表示數(shù)值,但"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))輸入一個整數(shù)數(shù)組,實現(xiàn)一個函數(shù)來調(diào)整該數(shù)組中數(shù)字的順序,使得所有奇數(shù)位于數(shù)組的前半部分,所有偶數(shù)位于數(shù)組的后半部分。
?
示例:
輸入: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;} }?
總結(jié)
以上是生活随笔為你收集整理的剑指offer:18-21记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三羊献瑞c语言编程入门,蓝桥杯-三羊献瑞
- 下一篇: 快速幂实现pow函数(从二分和二进制两种