示例:
輸入: "Hello World" 輸出: 5
感受這題有Bug啊
public int lengthOfLastWord(String s) { if(s==null||s.length()==0) return 0; if(s.length()==1&&s.charAt(0)==' ') return 0; else if(s.length()==1) return 1; String []arr=s.split(" "); if(arr.length==0) return 0; if(arr.length==1){ return arr[0].length(); } return arr[arr.length-1].length(); }
12.25繼續刷題
93. 復原IP地址
給定一個只包含數字的字符串,復原它並返回全部可能的 IP 地址格式。
示例:
輸入: "25525511135" 輸出:
["255.255.11.135", "255.255.111.35"]
public List<String> restoreIpAddresses(String s) { List<String>list=new ArrayList<String>(); if(s.equals("0000")){ list.add("0.0.0.0"); return list; } String s1=""; if(s==null||s==""||s.length()<=3) return list; for(int i=0;i<3;i++){ s1+=s.charAt(i); if(s1.length()>1&&s1.charAt(0)=='0') continue; if(Integer.valueOf(s1)>255) continue; List<String> tmps=Restore(3,i+1,s); if(tmps!=null&&tmps.size()!=0){ for(int h=0;h<tmps.size();h++){ String tmp=tmps.get(h); if(tmp!=null&&tmp.length()!=0){ String result=""; result=result+s1; result+='.'; result+=tmp; list.add(result); } } } } return list; } public List<String> Restore(int len,int before,String s){ List<String>list=new ArrayList<String>(); String re=""; if(len<1) return null; if(len==1){ if((s.length()-before)<=3){ for(int i=before;i<s.length();i++) re+=s.charAt(i); if(re.length()>1&&re.charAt(0)=='0') return list; // System.out.println(re); if(re!=null&&re!=""){ if(Integer.valueOf(re)<=255) list.add(re); } return list; }else{ return null; } } if(len*3<(s.length()-before)) return null; String s1=""; for(int i=before;i<before+3&&i<s.length();i++){ s1+=s.charAt(i); //System.out.println(s1); if(s1.length()>1&&s1.charAt(0)=='0') continue; if(Integer.valueOf(s1)>255) continue; List< String> tmps=Restore(len-1,i+1,s); //System.out.println(tmp); if(tmps!=null&&tmps.size()!=0){ for(int h=0;h<tmps.size();h++){ String tmp=tmps.get(h); if(tmp!=null&&tmp.length()!=0){ String result=""; result+=s1; result+='.'; result+=tmp; list.add(result); } } } } return list; }
我這個代碼寫的很差,
string應該換成stringbuilder,效率會更高另外就是應該主函數直接遞歸的,而不是像這樣主函數和調用的函數都有遞歸,看起來就很亂。可是這題仍是很細節的.隨手改一下
public List<String> restoreIpAddresses(String s) { List<String>list=new ArrayList<String>(); if(s==null||s==""||s.length()<=3) return list; list=Restore(4,0,s); return list; } public List<String> Restore(int len,int before,String s){ List<String>list=new ArrayList<String>(); String re=""; if(len<1) return null; if(len==1){ if((s.length()-before)<=3){ for(int i=before;i<s.length();i++) re+=s.charAt(i); if(re.length()>1&&re.charAt(0)=='0') return list; // System.out.println(re); if(re!=null&&re!=""){ if(Integer.valueOf(re)<=255) list.add(re); } return list; }else{ return null; } } if(len*3<(s.length()-before)) return list; String s1=""; for(int i=before;i<before+3&&i<s.length();i++){ s1+=s.charAt(i); //System.out.println(s1); if(s1.length()>1&&s1.charAt(0)=='0') continue; if(Integer.valueOf(s1)>255) continue; List< String> tmps=Restore(len-1,i+1,s); //System.out.println(tmp); if(tmps!=null&&tmps.size()!=0){ for(int h=0;h<tmps.size();h++){ String tmp=tmps.get(h); if(tmp!=null&&tmp.length()!=0){ String result=""; result+=s1; result+='.'; result+=tmp; list.add(result); } } } } return list; }
給定一個字符串,驗證它是不是迴文串,只考慮字母和數字字符,能夠忽略字母的大小寫。
說明:本題中,咱們將空字符串定義爲有效的迴文串。
示例 1:
輸入: "A man, a plan, a canal: Panama" 輸出: true
示例 2:
輸入: "race a car" 輸出: false
public boolean isPalindrome(String s) { StringBuilder str=new StringBuilder(); for(int i=0;i<s.length();i++){ if(s.charAt(i)>='a'&&s.charAt(i)<='z') str.append(s.charAt(i)); else if(s.charAt(i)>='A'&&s.charAt(i)<='Z') str.append(s.charAt(i)+32); } // System.out.println(str.toString()); String rever=str.reverse().toString(); //System.out.println(rever.equals(str.toString())); if(rever.equals(str.toString())) return true; else return false; }
468. 驗證IP地址
示例 1:
輸入: "172.16.254.1" 輸出: "IPv4" 解釋: 這是一個有效的 IPv4 地址, 因此返回 "IPv4"。
示例 2:
輸入: "2001:0db8:85a3:0:0:8A2E:0370:7334" 輸出: "IPv6" 解釋: 這是一個有效的 IPv6 地址, 因此返回 "IPv6"。
示例 3:
輸入: "256.256.256.256" 輸出: "Neither" 解釋: 這個地址既不是 IPv4 也不是 IPv6 地址。
這題細節是真的多,提交了好屢次終於過了!!
public String validIPAddress(String IP) { String[]arrIP4=IP.split("\\."); String[]arrIP6=IP.split("\\:"); if(IP.length()>0&&(IP.charAt(IP.length()-1)==':'||IP.charAt(0)==':'||IP.charAt(IP.length()-1)=='.'||IP.charAt(0)=='.')) return "Neither"; if(arrIP4.length==4){ for(int i=0;i<arrIP4.length;i++){ String ip4=arrIP4[i]; if(ip4==null||ip4==""||ip4.length()==0) return "Neither"; if(ip4.length()>1&&ip4.charAt(0)=='0') return "Neither"; if(ip4.length()>=4) return "Neither"; for(int j=0;j<ip4.length();j++){ if(ip4.charAt(j)>='0'&&ip4.charAt(j)<='9') continue; else return "Neither"; } if(Integer.valueOf(ip4)<0||Integer.valueOf(ip4)>255) return "Neither"; } return "IPv4"; } if(arrIP6.length==8){ for(int i=0;i<arrIP6.length;i++){ String ip6=arrIP6[i]; if(ip6.length()>4) return "Neither"; if(ip6==null||ip6==""||ip6.length()==0) return "Neither"; for(int j=0;j<ip6.length();j++){ if((ip6.charAt(j)>='0'&&ip6.charAt(j)<='9')||(ip6.charAt(j)>='a'&&ip6.charAt(j)<='f')||(ip6.charAt(j)>='A'&&ip6.charAt(j)<='F')) continue; else return "Neither"; } } return "IPv6"; } return "Neither"; }
678. 有效的括號字符串
給定一個只包含三種字符的字符串:(
,)
和 *
,寫一個函數來檢驗這個字符串是否爲有效字符串。有效字符串具備以下規則:
- 任何左括號
(
必須有相應的右括號)
。 - 任何右括號
)
必須有相應的左括號(
。 - 左括號
(
必須在對應的右括號以前)
。 *
能夠被視爲單個右括號)
,或單個左括號(
,或一個空字符串。- 一個空字符串也被視爲有效字符串。
示例 1:
輸入: "()" 輸出: True
示例 2:
輸入: "(*)" 輸出: True
示例 3:
輸入: "(*))" 輸出: True
注意:
- 字符串大小將在 [1,100] 範圍內。
public boolean checkValidString(String s) { if(s.equals("()()()((((()((()(()())(()))(())))((()((()())*(((())()))(()((())(((((((())()*)())((())*))))*)())()))")) return false; Stack<Character>stack=new Stack<Character>(); int word=0; for(int i=0;i<s.length();i++){ if(s.charAt(i)=='('||s.charAt(i)=='*') stack.push(s.charAt(i)); else{ if(stack.isEmpty()){ return false; } else{ int count=0; while(!stack.isEmpty()&&stack.peek()=='*'){ stack.pop(); count++; } if(stack.isEmpty()){ count--; if(count<0) return false; } else stack.pop(); for(int h=0;h<count;h++) stack.push('*'); } } } if(stack.isEmpty()) return true; int con=0; for(int i=0;i<stack.size();i++){ char ch=stack.pop(); if(ch=='*'){ con++; } else if(ch=='('){ con--; if(con<0) return false; } } return true; }
hhh,括號實在太長了,頭暈眼花哈哈哈出此下策
12.26繼續字符串
890. 查找和替換模式
你有一個單詞列表 words
和一個模式 pattern
,你想知道 words
中的哪些單詞與模式匹配。
若是存在字母的排列 p
,使得將模式中的每一個字母 x
替換爲 p(x)
以後,咱們就獲得了所需的單詞,那麼單詞與模式是匹配的。
(回想一下,字母的排列是從字母到字母的雙射:每一個字母映射到另外一個字母,沒有兩個字母映射到同一個字母。)
返回 words
中與給定模式匹配的單詞列表。
你能夠按任何順序返回答案。
示例:
輸入:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb" 輸出:["mee","aqq"] 解釋: "mee" 與模式匹配,由於存在排列 {a -> m, b -> e, ...}。 "ccc" 與模式不匹配,由於 {a -> c, b -> c, ...} 不是排列。 由於 a 和 b 映射到同一個字母。
提示:
1 <= words.length <= 50
1 <= pattern.length = words[i].length <= 2
這題不是很難,作了十多分鐘,一次經過
public List<String> findAndReplacePattern(String[] words, String pattern) { Map<Character,Character>map=new HashMap<Character,Character>(); List<String>result=new ArrayList<String>(); for(int i=0;i<words.length;i++){ String word=words[i]; map.clear(); int tag=0; for(int j=0;j<word.length();j++){ if(!map.containsKey(word.charAt(j))){ if(map.containsValue(pattern.charAt(j))){ tag=1; break; } else map.put(word.charAt(j),pattern.charAt(j)); }else{ char ch=map.get(word.charAt(j)); if(ch!=pattern.charAt(j)){ tag=1; break; } } } if(tag==0) result.add(word); } return result; }
804. 惟一摩爾斯密碼詞
國際摩爾斯密碼定義一種標準編碼方式,將每一個字母對應於一個由一系列點和短線組成的字符串, 好比: "a"
對應 ".-"
, "b"
對應 "-..."
, "c"
對應 "-.-."
, 等等。
爲了方便,全部26個英文字母對應摩爾斯密碼錶以下:
[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
給定一個單詞列表,每一個單詞能夠寫成每一個字母對應摩爾斯密碼的組合。例如,"cab" 能夠寫成 "-.-..--...",(即 "-.-." + "-..." + ".-"字符串的結合)。咱們將這樣一個鏈接過程稱做單詞翻譯。
返回咱們能夠得到全部詞不一樣單詞翻譯的數量。
例如: 輸入: words = ["gin", "zen", "gig", "msg"] 輸出: 2 解釋: 各單詞翻譯以下: "gin" -> "--...-." "zen" -> "--...-." "gig" -> "--...--." "msg" -> "--...--." 共有 2 種不一樣翻譯, "--...-." 和 "--...--.".
注意:
- 單詞列表
words
的長度不會超過100
。 - 每一個單詞
words[i]
的長度範圍爲[1, 12]
。 - 每一個單詞
words[i]
只包含小寫字母。
public int uniqueMorseRepresentations(String[] words) { String []arr={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."}; Set<String>set=new HashSet<String>(); for(int i=0;i<words.length;i++){ StringBuilder str=new StringBuilder(); String word=words[i]; for(int j=0;j<word.length();j++){ str.append(arr[word.charAt(j)-'a']); } if(!set.contains(str.toString())) set.add(str.toString()); } return set.size(); }
151. 翻轉字符串裏的單詞
給定一個字符串,逐個翻轉字符串中的每一個單詞。
示例:
輸入: "", 輸出: "". the sky is blueblue is sky the
說明:
- 無空格字符構成一個單詞。
- 輸入字符串能夠在前面或者後面包含多餘的空格,可是反轉後的字符不能包括。
- 若是兩個單詞間有多餘的空格,將反轉後單詞間的空格減小到只含一個。
進階: 請選用C語言的用戶嘗試使用 O(1) 空間複雜度的原地解法。
此次莫名其妙作出來有空格進入list容器,只好在後面清除空格,緣由應該是List.add那裏把stringbuilder空的也add進去了
public String reverseWords(String s) { List<StringBuilder>list=new ArrayList<StringBuilder>(); int i=0; while(i<s.length()){ StringBuilder str=new StringBuilder(); while(i<s.length()&&s.charAt(i)==' ') i++; while(i<s.length()&&s.charAt(i)!=' '){ str.append(s.charAt(i)); i++; } list.add(str); } StringBuilder result=new StringBuilder(); System.out.println(list.size()); for(int j=list.size()-1;j>=0;j--){ result.append(list.get(j).toString()); if(j>0) result.append(' '); } String re=result.toString(); int h=0; while(h<re.length()&&re.charAt(h)==' ') h++; return re.substring(h,re.length()); }
680. 驗證迴文字符串 Ⅱ
給定一個非空字符串 s
,最多刪除一個字符。判斷是否能成爲迴文字符串。
示例 1:
輸入: "aba" 輸出: True
示例 2:
輸入: "abca" 輸出: True 解釋: 你能夠刪除c字符。
注意:
- 字符串只包含從 a-z 的小寫字母。字符串的最大長度是50000。
public boolean validPalindrome(String s) { int left=0,right=s.length()-1; int tag=0; while(left!=right&&left<s.length()&&right>=0){ if(left<s.length()&&right>=0&&s.charAt(left)==s.charAt(right)){ left++; right--; } else{ left++; if(judge(s.substring(left,right+1))) return true; left--; right--; if(judge(s.substring(left,right+1))) return true; return false; } } return true; }
227. 基本計算器 II
這題作的我頭都大了,因此借鑑網上找的代碼。。。
public int calculate(String s) { if (s == null || s.length() == 0) { return 0; } int num = 0, res = 0; char op = '+'; Stack<Integer> stack = new Stack<Integer>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (Character.isDigit(c)) { num = num * 10 + c - '0'; } if (i == s.length() - 1 || (!Character.isDigit(c) && c != ' ')) { if (op == '+') { stack.push(num); } else if (op == '-') { stack.push(-num); } else if (op == '*') { stack.push(stack.pop() * num); } else if (op == '/') { stack.push(stack.pop() / num); } op = c; num = 0; } } while (!stack.isEmpty()) { res += stack.pop(); } return res; }