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;
    }
}

4. Median of Two Sorted Arrays

        int x=nums1.length+nums2.length;
        ArrayList<Integer> a=new ArrayList<Integer>();//必须要用一个可变数组,不能光用i和j,并且最后用.size返回它的大小
        boolean isOdd;//用一个boolean判断两个数组的大小的和是否为基数
        if(x%2==0)
            isOdd=false;
        else
            isOdd=true;
        double result=0.0;
        int i=0,j=0;
        while(i<nums1.length||j<nums2.length){
            if(i<nums1.length&&j<nums2.length){//先判断是否都小于数组长度,然后再分开判断
                if(nums1[i]<nums2[j]){
               a.add(nums1[i]);
               i++;
           }
            else{
                a.add(nums2[j]);
                j++;
            }
        }
            else if(i<nums1.length)//如果两个中有已经超出数组长度的判断
            {
                a.add(nums1[i]);
                i++;
            }
            else{
                a.add(nums2[j]);
                j++;
            }
           
            if(a.size()==(x/2+1)){
                result=(isOdd==true?a.get(a.size()-1):((double)(a.get(a.size()-1)+a.get(a.size()-2)))/2.0);
            }
        }
               return result;

猜你喜欢

转载自blog.csdn.net/qq_33605294/article/details/83151183