LeetCode 1~20题——NWU_LK

LeetCode第1题

两数之和,用 java 实现,采用暴力法

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int results[] = new int[2];
        for(int i=0;i<nums.length;i++){
            for(int j=i+1;j<nums.length;j++){
                if(nums[i]+nums[j]==target){
                    results[0]=i;
                    results[1]=j;
                    return results;
                }
            }
        }
        return null;
    }
}

LeetCode第2题

两数相加

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode result=null;  //用来存放结果
        ListNode p=null;  //用来指向result链表中的最后一个结点
        int a=0;  //用来记录两个数相加后进位多少
        int temp=0;   //用来记录两个数相加后存入result的值
        while(l1!=null && l2!=null){
            int sum = l1.val+l2.val+a;
            a=0;
            if(sum<10){
                temp=sum;
            }else{
                a = sum / 10;
                temp = sum % 10;
            }
            ListNode node=new ListNode(temp);
            if(result!=null){
                p.next=node;
                p=p.next;
            }else{
                result=node;
                p=result;
            }
            l1=l1.next;
            l2=l2.next;
        }
        if(l1==null){
            while(l2!=null){
                int sum = l2.val+a;
                a=0;
                if(sum<10){
                    temp=sum;
                }else{
                    a = sum / 10;
                    temp = sum % 10;
                }
                ListNode node=new ListNode(temp);
                p.next=node;
                p=p.next;
                l2=l2.next;
            }   
        }
        if(l2==null){
            while(l1!=null){
                int sum = l1.val+a;
                a=0;
                if(sum<10){
                    temp=sum;
                }else{
                    a = sum / 10;
                    temp = sum % 10;
                }
                ListNode node=new ListNode(temp);
                p.next=node;
                p=p.next;
                l1=l1.next;
            }   
        }
        //此情况是刚好两个链表位数相同时,最后加完需要把进位连到后边
        if(a!=0){
            ListNode node=new ListNode(a);
            p.next=node;
            p=p.next;
        }
        return result;
    }
}

LeetCode第3题

无重复字符的最长子串

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int max=0;
        List<Character> lists=new ArrayList<>();
        for (int start=0;start<s.length();start++){
            for (int i=start;i<s.length();i++){
                if (!lists.contains(s.charAt(i))){
                    lists.add(s.charAt(i));
                    if (lists.size()>max){
                        max=lists.size();
                        System.out.println(lists.size());
                    }
                }else {
                    lists.clear();
                    break;
                }
            }

        }
        return max;
    }
}

LeetCode第4题

寻找两个正序数组的中位数

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int c[]=new int[nums1.length+nums2.length];
        int loc=0;
        int i=0,j=0;
        while (i<nums1.length && j< nums2.length){
            if (nums1[i]<=nums2[j]){
                c[loc++]=nums1[i++];
            }else {
                c[loc++]=nums2[j++];
            }
        }
        while (i<nums1.length){
            c[loc++]=nums1[i++];
        }
        while (j<nums2.length){
            c[loc++]=nums2[j++];
        }
        if (c.length%2==1){
            return (double) c[c.length/2];
        }else {
            return (double) (c[c.length/2]+c[c.length/2-1])/2;
        }
    }
}

LeetCode第5题

求最长回文子串,动态规划

class Solution {
    public String longestPalindrome(String s) {
        int length=s.length();
        String result="";
        boolean[][] p=new boolean[length][length];
        for (int len=1;len<=length;len++){
            for (int start=0;start<=length-len;start++){
                int end = start+len-1;
                if (start==end){
                    p[start][start]=true;
                }
                if (start+1==end){
                    p[start][end]=s.charAt(start)==s.charAt(end);
                }
                if (start+1<end){
                    p[start][end]=s.charAt(start)==s.charAt(end) && p[start+1][end-1];
                }
                if (p[start][end]&& len>result.length()){
                    result=s.substring(start,end+1);
                }
            }
        }
        return result;
    }
}

LeetCode第6题

Z 字形变换

class Solution {
    public String convert(String s, int numRows) {
        if (numRows==1)
            return s;
        int num[]=new int[s.length()];
        int flag=1; //flag为正则是加,为负则是减
        int xuhao=1;
        //给每个字符标上行号
        for (int i=0;i<s.length();i++){
            if (flag==1){
                num[i]=xuhao++;
            }else {
                num[i]=xuhao--;
            }
            if (xuhao==numRows){
                flag=-1;
            }
            if (xuhao==1){
                flag=1;
            }
        }
        StringBuilder sb=new StringBuilder();
        for (int i=1;i<=numRows;i++){
            for (int j=0;j<s.length();j++){
                if (num[j]==i){
                    sb.append(s.charAt(j));
                }
            }
        }
        return sb.toString();
    }
}

LeetCode第7题

整数反转
方法一:拼接思想

class Solution {
    public int reverse(int x) {
        List<Integer> lists=new ArrayList<>();
        boolean fu=false;
        if(x==0){
            return x;
        }
        if (x<0){
            x=(-x);
            fu=true;
        }
        int i=0;
        while(x>=10){
            i=x%10;
            lists.add(i);
            x=x/10;
        }
        lists.add(x);
        StringBuilder sb=new StringBuilder();
        boolean flag=false;
        for (int j=0;j<lists.size();j++){
            int value=lists.get(j);
            if (value!=0){
                flag=true;
            }
            if (flag){
                sb.append(value);
            }
        }
        
        long i1 = Long.parseLong(sb.toString());
        if (fu){
            i1=(-i1);
        }
        if (i1>Integer.MAX_VALUE||i1<Integer.MIN_VALUE){
            i1=0;
        }
        return (int)i1;
    }
}

方法二:计算思想(更优)

class Solution {
    public int reverse(int x) {
        long n = 0;
        while(x != 0) {
            n = n*10 + x%10;
            x = x/10;
        }
        if (n>Integer.MAX_VALUE||n<Integer.MIN_VALUE){
            return 0;
        }else {
            return (int)n;
        }
    }
}

LeetCode第8题

字符串转换整数

class Solution {
    public int myAtoi(String str) {
        str=str.trim();
        boolean fu=false;
        if("".equals(str)){
            return 0;
        }
        char pre='z';
        long n=0;
        for (int i=0;i<str.length();i++){
            char x=str.charAt(i);
            if (x=='-'||x=='+'){  
                if (pre=='-'||pre=='+'){   //用来防止‘+-2这个坑爹例子’
                    return 0;
                }
                if (Character.isDigit(pre)){ //用来防止‘22-这个例子’
                    break;
                }
                pre=x;
                continue;
            }
            if (Character.isDigit(x)){
                if (pre=='-'){
                    fu=true;
                }
                n=(n*10+Long.parseLong(String.valueOf(x)));
                if (n>Integer.MAX_VALUE){    //用来防止long越界
                    break;
                }
            }else {
                break;
            }
            pre=x;
        }
        if (fu){
            n=(-n);
        }
        if (n<Integer.MIN_VALUE){
            return Integer.MIN_VALUE;
        }
        if (n>Integer.MAX_VALUE){
            return Integer.MAX_VALUE;
        }
        return (int)n;
    }
}

LeetCode第9题

回文数

class Solution {
    public boolean isPalindrome(int x) {
        String s=x+"";
        int p=0,q=s.length()-1;
        while(p<=q){
            if (s.charAt(p)==s.charAt(q)){
                p++;
                q--;
            }else {
                return false;
            }
        }
        return true;
    }
}

LeetCode第10题

正则匹配:利用动态规划

class Solution {
    public boolean isMatch(String s, String p) {
        boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
        dp[0][0] = true;

        for (int i=1;i<dp[0].length;i++){
            char ch=p.charAt(i-1);
            if (ch=='*'){
                if (i==1){
                    dp[0][i]=true;
                    continue;
                }
                dp[0][i]=dp[0][i-2];
            }
        }


        for (int row=1;row<dp.length;row++){
            char ch=s.charAt(row-1);
            for (int col=1;col<dp[row].length;col++){
                char ch2=p.charAt(col-1);
                if (ch2==ch||ch2=='.'){
                    dp[row][col]=dp[row-1][col-1];
                }
                else if (ch2=='*'){
                    if (col>1){
                        if (dp[row][col-2]){
                            dp[row][col]=true;
                        }else{
                            char pre=p.charAt(col-2);
                            if (pre==ch || pre=='.'){
                                dp[row][col]=dp[row-1][col];
                            }
                        }
                    }
                }
            }
        }
        return dp[s.length()][p.length()];
    }
}

LeetCode第11题

盛最多水的容器

class Solution {
    public int maxArea(int[] height) {
        int max=0;
        for (int i=0;i<height.length-1;i++){
            for (int j=i+1;j<height.length;j++){
                int width=j-i;
                int high=Math.min(height[i],height[j]);
                int area=width*high;
                if (area>max){
                    max=area;
                }
            }
        }
        return max;
    }
}

LeetCode第12题

整数转罗马数字(贪心算法)

class Solution {

    public String intToRoman(int num) {
        int[] value = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        String[] flags = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        StringBuilder sb=new StringBuilder();
        for (int i=0;i<value.length;i++){
            while (num>=value[i]){
                num-=value[i] ;
                sb.append(flags[i]);
            }
            if (num<=0)
                break;
        }
        return sb.toString();
    }
}

LeetCode第13题

罗马数字转整数

class Solution {
    public int romanToInt(String s) {
        int result=0;
        Map<Character,Integer> map=new HashMap<>();
        map.put('I',1);map.put('V',5);map.put('X',10);
        map.put('L',50);map.put('C',100);map.put('D',500);
        map.put('M',1000);
        for(int i=0;i<s.length();i++){
            int value=map.get(s.charAt(i));
            if (i+1<s.length() && value<map.get(s.charAt(i+1))){
                value=(-value);
            }
            result+=value;
        }
        return result;
    }
}

LeetCode第14题

最长公共前缀

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs.length==0){
            return "";
        }
        //求出数组中长度最短的字符串长度
        StringBuilder sb=new StringBuilder();
        int min=Integer.MAX_VALUE;
        for (int i=0;i<strs.length;i++){
            if (strs[i].length()<min)
                min=strs[i].length();
        }
        boolean flag =true;
        out:
        for (int i=0;i<min;i++){
            char s=strs[0].charAt(i);
            for (int j=1;j<strs.length;j++){
                if (strs[j].charAt(i)!=s){
                    flag=false;
                    break out;
                }
            }
            sb.append(s);
        }
        return sb.toString();
    }
}

LeetCode第15题

三数之和

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ans = new ArrayList();
        if(nums == null || nums.length < 3) return ans;
        Arrays.sort(nums);
        for(int i=0;i<nums.length;i++){
            if (nums[i]>0)//当i大于0时总和不可能为0
                break;
            if (i>0&&nums[i]==nums[i-1])  //当i和前一个相同时跳过
                continue;
            int L=i+1,R=nums.length-1;
            while(L<R){
                int sum=nums[i]+nums[L]+nums[R];
                if (sum==0){
                    ans.add(Arrays.asList(nums[i],nums[L],nums[R]));
                    while (L<R && nums[L]==nums[L+1]){
                        L++;
                    }
                    while (L<R && nums[R]==nums[R-1]){
                        R--;
                    }
                    L++;
                    R--;
                }else if (sum<0){
                    L++;
                }else if (sum>0){
                    R--;
                }
            }
        }
        return ans;
    }
}

LeetCode第16题

最接近的三数之和

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int dis=Integer.MAX_VALUE;
        int result=0;
        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));
        for(int i=0;i<nums.length-2;i++){
            if (i>0&&nums[i]==nums[i-1])  //当i和前一个相同时跳过
                continue;
            for (int j=i+1;j<nums.length-1;j++){
                if (j>i+1&&nums[j]==nums[j-1]){
                    continue;
                }
                for (int k=j+1;k<nums.length;k++){
                    int sum=nums[i]+nums[j]+nums[k];
                    int newdis=Math.abs(sum-target);
                    if (newdis<dis){
                        dis=newdis;
                        result=sum;
                    }
                }
            }
        }
        return result;
    }
}

LeetCode第17题

电话号码的字母组合:无剪枝的回溯法

class Solution {
    private List<String> result=new ArrayList<>();
    private String[] map = {" ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    private StringBuilder sb=new StringBuilder();
    public List<String> letterCombinations(String digits) {
        if (digits==null || digits.length()==0){
            return new ArrayList<>();
        }
        traceback(digits,0);
        return result;
    }
    public void traceback(String digits,int index){
        if (index>digits.length()-1){
            result.add(sb.toString());
            return;
        }
        int x=Integer.parseInt(digits.charAt(index)+"");
        String s=map[x];
        for (int i=0;i<s.length();i++){
            sb.append(s.charAt(i));
            traceback(digits,index+1);
            sb.deleteCharAt(sb.length()-1);
        }
    }
}

LeetCode第18题

四数之和

class Solution {
    private List<List<Integer>> result=new ArrayList<>();
    public List<List<Integer>> fourSum(int[] nums, int target) {

        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));
        for(int i=0;i<nums.length-2;i++){
            if (i>0&&nums[i]==nums[i-1])  
                continue;
            for (int j=i+1;j<nums.length-1;j++){
                if (j>i+1&&nums[j]==nums[j-1]){
                    continue;
                }
                for (int m=j+1;m<nums.length;m++){
                    if (m>j+1&&nums[m]==nums[m-1]){
                        continue;
                    }
                    for (int n=m+1;n<nums.length;n++){
                        if (n>m+1&&nums[n]==nums[n-1]){
                            continue;
                        }
                        if (nums[i]+nums[j]+nums[m]+nums[n]==target){
                            result.add(new ArrayList(Arrays.asList(nums[i], nums[j], nums[m], nums[n])));
                        }
                    }
                }
            }
        }
        return result;
    }
}

LeetCode第19题

删除链表的倒数第N个节点,垃圾题目一个,链表不带头节点,sb让做题人自己猜呢?怕不是没脑子吧。

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode MyLinkList=new ListNode(0);
        MyLinkList.next=head;
        ListNode p=MyLinkList;
        ListNode q=MyLinkList;
        for (int i=0;i<n;i++){
            p=p.next;
        }
        while (p.next!=null){
            p=p.next;
            q=q.next;
        }
        q.next=q.next.next;
        return MyLinkList.next;
    }
}

LeetCode第20题

有效的括号

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack=new Stack<>();
        for (int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if (c=='[' ||c=='('||c=='{'){
                stack.push(c);
            }else{
                if (stack.isEmpty()){
                    return false;
                }
                boolean flag=match(stack.pop(),c);
                if (!flag){
                    return false;
                }
            } 
        }
        return stack.isEmpty();
    }
    public boolean match(char a,char b){
        if (a=='('&&b==')'){
            return true;
        }else if (a=='{'&&b=='}'){
            return true;
        }else return a == '[' && b == ']';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值