java細節知識(leetcode刷題(一))
1.leetcode344
str2 = new StringBuffer(str2).reverse().toString();
StringBuilder rev = new StringBuilder();rev.toString();
String orig;char[] s = orig.toCharArray();
char[] s;String st=new String(s);st=s.toString();
2.136
對於任何數x,都有x^x=0,x^0=x
Java:return 必須在合適的位置,不能再迴圈裡面;break也只能用一次。
3 .
list可以有重複,set不可以有重複的,如果發現有重複的,則不會新增。hashset可以取代arraylist。
map:hashmap就是鍵值和值(key和value),多個鍵可以對應一個value,但是一個key不能多對應多個value。
arraylist也可以sort,但是需要繼承comparable介面,也可以繼承comparator類。
4.104
這道題也可以用,遞迴的方法做,但是比較難理解,用層序遍歷(即圖的廣度優先遍歷)比較好理解。
LinkedList在這這裡是作為佇列,add()==addLast(),poll()==poll(),push()==addFirst()
LinkedList可以作為佇列或是棧使用,但是ArrayList只是作為一個可以動態變化大小的陣列。
class Solution { public int maxDepth(TreeNode root) { LinkedList<TreeNode> ar=new LinkedList<TreeNode>(); ar.push(root); int level=0; int nextnum=0; int curnum=1; while(!ar.isEmpty()) { TreeNode current=ar.pop();//放在迴圈以外就不行了,注意程式碼的區域性性吧 curnum--; if(current.left!=null) { ar.push(current.left); nextnum++; } if(current.right!=null) { ar.push(current.right); nextnum++; } if(curnum==0) { level++; curnum=nextnum; nextnum=0; } } return level; } }
還有一種方法,遞迴的方法。
class Solution {
public int maxDepth(TreeNode root) {
if(root==null)
return 0;
int left=maxDepth(root.left);
int right=maxDepth(root.right);
return left>right?(left+1):(right+1);
}
}
5.283 move zeros
int len = nums.length; int idx = 0; for(int i = 0; i < len; i ++) { if(nums[i]!=0) { nums[idx ++] = nums[i]; } } for(int i = idx; i < len; i ++) nums[i] = 0;
6.反轉連結串列 206
錯誤例子(不知道哪裡錯了),p 是多餘的,而且不能保證c不為null,
public ListNode reverseList(ListNode head) {
ListNode p=head;
ListNode c=head.next;
ListNode n=c.next;
head.next=null;
while(c!=null)
{
c.next=p;
p=c;
c=n;
if(n!=null)
{
n=n.next;
}
head=p;
}
return head;
}
正確例子
ss Solution {
public ListNode reverseList(ListNode head) {
if(head==null)
return head;
ListNode pre=head.next;
ListNode cur=null;
while(head!=null)
{
head.next=cur;
cur=head;
head=pre;
if(head!=null)
pre=head.next;
}
return cur;
}
7.171
int l=s.length();
int r=0;
for(int i=0;i<l;i++)
{
r=r+((int)s.charAt(i)-(int)'A'+1)*(int)Math.pow((double)26,(double)l-i-1);
}
return r;
8. 169 arrays這個類之後可以再學一些用法
Arrays.sort(num);
return num[num.length/2];
9.題13,注意HashMap的用法。主要就put和get,還有size(),containsKey(),containsValue().
public int romanToInt(String s) {
HashMap<Character,Integer> h=new HashMap<Character,Integer>();
h.put('I',1);
h.put('V',5);
h.put('X',10);
h.put('L',50);
h.put('C',100);
h.put('D',500);
h.put('M',1000);
int result=0;
for(int i=0;i<s.length();i++)
{
if((s.length()-i)==1)
{
result=result+h.get(s.charAt(i));
break;
}
if(h.get(s.charAt(i))>=h.get(s.charAt(i+1)))
{
result=result+h.get(s.charAt(i));
}
else
{
result=result+h.get(s.charAt(i+1))-h.get(s.charAt(i));
i++;
}
}
return result;
}
10.longest palindromic substring (5)
主要就是抓住,迴文字串,重要的是最中間那個字元,我們可以利用它來進行遍歷
注意substring的用法,right是子字串後面那一位。
class Solution {
public String longestPalindrome(String s) {
int left=0;
int right=0;
int j;
int k;
for(int i=0;i<s.length();i++)
{
j=i;
k=j;
while((k<s.length()-1)&&s.charAt(k)==s.charAt(k+1))
k++;
while(j>=0&&k<s.length()&&(s.charAt(j)==s.charAt(k)))
{
j--;
k++;
}
if((right-left)<(k-j-1))
{
left=j+1;
right=k-1;
}
}
if(right==s.length())
return s.substring(left);
else
return s.substring(left,right+1);
}
}
11. 8. String to Integer (atoi)
class Solution {
public int myAtoi(String str) {
str = str.trim(); // kill add white spaces
if (str == null || str.length() < 1) {
return 0;
}
int i = 0; // index of str
char flag = '+'; // default positive
if (str.charAt(0) == '-') {
flag = '-';
i++;
} else if (str.charAt(0) == '+') {
i++;
}
double res = 0;
// abandon the non-digit char; calculate the result
while (str.length() > i && str.charAt(i) >= '0' && str.charAt(i) <= '9') {
res = res * 10 + str.charAt(i) - '0';
i++;
}
if (flag == '-') res = -1 * res;
if (res > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
} else if (res < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
return (int) res;
}
}
10. Regular Expression Matching 這題主要是根據p的情況來考慮
- 若p為空,若s也為空,返回true,反之返回false
- 若p的長度為1,若s長度也為1,且相同或是p為'.'則返回true,反之返回false
- 若p的第二個字元不為*,若此時s為空返回false,否則判斷首字元是否匹配,且從各自的第二個字元開始呼叫遞迴函式匹配
- 若p的第二個字元為*,若s不為空且字元匹配,呼叫遞迴函式匹配s和去掉前兩個字元的p,若匹配返回true,否則s去掉首字母
- 返回呼叫遞迴函式匹配s和去掉前兩個字元的p的結果
class Solution {
public boolean isMatch(String s, String p) {
if(p.length()==0)
return s.isEmpty();
if(p.length()==1)
return s.length()==1&&(s.charAt(0)==p.charAt(0)||p.charAt(0)=='.');
if(p.charAt(1)!='*'){
if(s.length()==0) return false;
return ((s.charAt(0)==p.charAt(0))||p.charAt(0)=='.')&&isMatch(s.substring(1),p.substring(1));
}
else{
while((s.length()>0)&&(s.charAt(0)==p.charAt(0)||p.charAt(0)=='.')){
if(isMatch(s,p.substring(2))) return true;
s=s.substring(1);
}
}
return isMatch(s,p.substring(2));
}
}
當時在 while((s.length()>0)&&(s.charAt(0)==p.charAt(0)||p.charAt(0)=='.'))難了一會,因為沒有加(s.charAt(0)==p.charAt(0)||p.charAt(0)=='.')的括號,導致問題。
9. Palindrome Number
class Solution {
public boolean isPalindrome(int x) {
if(x<0||(x%10==0&&x!=0))
return false;
int num=0;
while(x>num){
num=num*10+x%10;
x=x/10;
}
return x==num||num/10==x;
}
}