LeetCode(三)
最长不重复子串
public class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s==null || s.length()==0){return 0;}
        int len = s.length(),maxLen=0,slow=0,fast=0;
        HashMap<Character,Integer>  map = new HashMap<Character,Integer>();
        for(;fast<len;fast++){
            char currentChar = s.charAt(fast);
            if(map.get(currentChar) == null){
                map.put(currentChar,fast);
                maxLen = Integer.max(maxLen,fast-slow + 1);
            }else{
                int lastPosition = map.get(currentChar);
                if(lastPosition < slow){
                    maxLen = Integer.max(maxLen,fast - slow + 1);
                    map.put(currentChar,fast);
                }else{
                    slow = lastPosition + 1;
                    map.put(currentChar,fast);
                }
            }
        }
        return maxLen;
    }
}
String to Integer
public class Solution {
    public int myAtoi(String str) {
        int p = 0, ret = 0;
        if(p == str.length()) return 0;
        while(Character.isWhitespace(str.charAt(p)) && p<str.length()) p++;
        boolean isNeg = (str.charAt(p) == '-') ? true : false;
        if(str.charAt(p) == '+' || str.charAt(p) == '-') p++;
        for(;p<str.length();p++){
            if(str.charAt(p)>'9' || str.charAt(p)<'0'){
                break;
            }else{
                int digit = str.charAt(p) - '0';
                if(!isNeg  && ret > (Integer.MAX_VALUE - digit)/10) return Integer.MAX_VALUE;
                else if(isNeg && ret < (Integer.MIN_VALUE + digit)/10) return Integer.MIN_VALUE;
                ret = ret * 10 + (isNeg ? -digit : digit);
            }
        }
        return ret;
    }
}
Reverse LinkedList
public class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null) return head;
        ListNode newhead = new ListNode(0);
        newhead.next = head;
        while(head.next!=null) {
            ListNode tmp = head.next;
            head.next = head.next.next;
            tmp.next = newhead.next;
            newhead.next = tmp;
        }
        return newhead.next;
    }
}
Reverse LinkedList II
public class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        if(head == null) return null;
        ListNode dummy = new ListNode(0); // create a dummy node to mark the head of this list
        dummy.next = head;
        ListNode pre = dummy; // make a pointer pre as a marker for the node before reversing
        for(int i = 0; i<m-1; i++) pre = pre.next;
        ListNode start = pre.next; // a pointer to the beginning of a sub-list that will be reversed
        ListNode then = start.next; // a pointer to a node that will be reversed
        // 1 - 2 -3 - 4 - 5 ; m=2; n =4 ---> pre = 1, start = 2, then = 3
        // dummy-> 1 -> 2 -> 3 -> 4 -> 5
        for(int i=0; i<n-m; i++)
        {
            start.next = then.next;
            then.next = pre.next;
            pre.next = then;
            then = start.next;
        }
        // first reversing : dummy->1 - 3 - 2 - 4 - 5; pre = 1, start = 2, then = 4
        // second reversing: dummy->1 - 4 - 3 - 2 - 5; pre = 1, start = 2, then = 5 (finish)
        return dummy.next;
    }
}
Reverse Nodes in K-Group
public class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode begin;
        if (head==null || head.next ==null || k==1)
            return head;
        ListNode dummyhead = new ListNode(-1);
        dummyhead.next = head;
        begin = dummyhead;
        int i=0;
        while (head != null){
            i++;
            if (i%k == 0){
                begin = reverse(begin, head.next);
                head = begin.next;
            } else {
                head = head.next;
            }
        }
        return dummyhead.next;
    }
    public ListNode reverse(ListNode begin, ListNode end){
        ListNode curr = begin.next;
        ListNode next, first;
        ListNode prev = begin;
        first = curr;
        while (curr!=end){
            next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        begin.next = prev;
        first.next = curr;
        return first;
    }
}
Linked List Cycle
public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode p = head,pre = head;
        while(p != null && p.next != null){
            if (p.next == head) return true;
            p = p.next;
            pre.next = head;
            pre = p;
        }
        return false;
    }
}
Linked List Cycle II
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while (fast!=null && fast.next!=null){
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow){
                ListNode slow2 = head;
                while (slow2 != slow){
                    slow = slow.next;
                    slow2 = slow2.next;
                }
                return slow;
            }
        }
        return null;
    }
}
Sort List
public class Solution {
    ArrayList<Integer> theArray=new ArrayList<Integer>();
    public ListNode sortList(ListNode head) {
        if(head==null)return head;
        ListNode focusNode=head;
        while(focusNode!=null)
        {
            theArray.add(focusNode.val);
            focusNode=focusNode.next;
        }
        quickSort(0,theArray.size()-1);
        focusNode=head;
        for(int i=0;focusNode!=null;i++)
        {
            focusNode.val=theArray.get(i);
            focusNode=focusNode.next;
        }
        return head;
    }
    public void quickSort(int left,int right)
    {
        if(right-left<=0)
            return;
        else {
            int pivot=theArray.get(right);
            int partition=partioning(left, right, pivot);
            quickSort(left, partition-1);
            quickSort(partition+1, right);
        }
    }
    public int partioning(int left,int right,long pivot)
    {
        int leftptr=left-1;
        int rightptr=right;
        while(true)
        {
            while(theArray.get(++leftptr)<pivot)
                ;
            while(rightptr>0 &&theArray.get(--rightptr)>pivot)
                ;
            if(leftptr>=rightptr)
                break;
            else {
                swap(leftptr,rightptr);
            }
        }
        swap(leftptr,right);
        return leftptr;
    }
    public void swap(int indx1,int indx2)
    {
        int temp=theArray.get(indx1);
        theArray.set(indx1, theArray.get(indx2));
        theArray.set(indx2, temp);
    }
}
Reorder List
public class Solution {
    public void reorderList(ListNode head) {
        if(head==null||head.next==null) return;
        //Find the middle of the list
        ListNode p1=head;
        ListNode p2=head;
        while(p2.next!=null&&p2.next.next!=null){
            p1=p1.next;
            p2=p2.next.next;
        }
        //Reverse the half after middle  1->2->3->4->5->6 to 1->2->3->6->5->4
        ListNode preMiddle=p1;
        ListNode preCurrent=p1.next;
        while(preCurrent.next!=null){
            ListNode current=preCurrent.next;
            preCurrent.next=current.next;
            current.next=preMiddle.next;
            preMiddle.next=current;
        }
        //Start reorder one by one  1->2->3->6->5->4 to 1->6->2->5->3->4
        p1=head;
        p2=preMiddle.next;
        while(p1!=preMiddle){
            preMiddle.next=p2.next;
            p2.next=p1.next;
            p1.next=p2;
            p1=p2.next;
            p2=preMiddle.next;
        }
    }
}
Copy List with Random Pointer
public class Solution {
    public RandomListNode copyRandomList(RandomListNode head) {
        if(head==null){
            return null;
        }
        RandomListNode n = head;
        while (n!=null){
            RandomListNode n2 = new RandomListNode(n.label);
            RandomListNode tmp = n.next;
            n.next = n2;
            n2.next = tmp;
            n = tmp;
        }
        n=head;
        while(n != null){
            RandomListNode n2 = n.next;
            if(n.random != null)
                n2.random = n.random.next;
            else
                n2.random = null;
            n = n.next.next;
        }
        //detach list
        RandomListNode n2 = head.next;
        n = head;
        RandomListNode head2 = head.next;
        while(n2 != null && n != null){
            n.next = n.next.next;
            if (n2.next == null){
                break;
            }
            n2.next = n2.next.next;
            n2 = n2.next;
            n = n.next;
        }
        return head2;
    }
}
LeetCode(三)的更多相关文章
- LeetCode 三数之和 — 优化解法
		LeetCode 三数之和 - 改进解法 题目:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复 ... 
- Leetcode(三)无重复字符的最长子串
		3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ... 
- [leetcode]三数之和
		三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复 ... 
- Leetcode | N-Queens I & II
		N-Queens I The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no ... 
- [LeetCode] 3Sum Smaller 三数之和较小值
		Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 < ... 
- [LeetCode] 3Sum Closest 最近三数之和
		Given an array S of n integers, find three integers in S such that the sum is closest to a given num ... 
- [LeetCode] 3Sum 三数之和
		Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ... 
- LeetCode 628. Maximum Product of Three Numbers (最大三数乘积)
		Given an integer array, find three numbers whose product is maximum and output the maximum product. ... 
- LeetCode 259. 3Sum Smaller (三数之和较小值) $
		Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 < ... 
随机推荐
- 过滤HTML代码
			public static string FilterHtml(string string_include_html) { string[] HtmlRegexArr ={ #region Html ... 
- 02 Linux 下安装JDK并测试开发“Hello World!”
			测试环境 主机系统:Win7 64位 虚拟机:VMware® Workstation 11.1.0 虚拟机系统:CentOS 6.5 64位 Kernel 2.6.32-431.e16.x86_6 ... 
- python分布式任务调度Celery
			Celery是Python开发的分布式任务调度模块,今天抽空看了一下,果然接口简单,开发容易,5分钟就写出了一个异步发送邮件的服务. Celery本身不含消息服务,它使用第三方消息服务来传递任务,目前 ... 
- Linux修改/etc/profile不生效的问题
			今天在原来的机器上修改了JDK的路径配置,但死活不生效. 后来查了~/.bash_profile文件,里面没有配置. 最后查~/.bashrc文件,发现里面有JDK的配置 
- 不是技术牛人,如何拿到国内IT巨头的Offer(转载)
			转载的文章,中间有几段需要去学习. byvoid 面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic-在跪拜之余我们不禁要想,和 ... 
- R&S学习笔记(一)
			1.一个VRF有两个主要的组成部分:路由区分符RD和路由目标RT.一个路由区分符(RD)是一个数字,除了帮助识别在一个提供商的网络中的VPN和允许重叠 IP区域之外没有其它的含义.RD是一个分为两个部 ... 
- (转)MyEclipse自动生成Hibernate实体类, oracle篇
			转自http://blog.csdn.net/hejinwei_1987/article/details/9465529 1.打开 windows -> Open Perspective -&g ... 
- Linux 组群账户管理
			一.Linux组群账户配置文件 1./etc/group文件 /etc/group文件是用户组群的配置文件,内容包括用户和用户组群,并且能显示出用户是归属哪个用户组群或哪几个用户组群.一个用户可以归属 ... 
- python中subprocess.Popen.poll
			import subprocess proc = subprocess.Popen(['python', 'test.py'], stdout=subprocess.PIPE) while 1: pr ... 
- 【Python】python2.7安装pysvn
			wget最新的版本地址自己修改 1.编译安装apr.apr-utilwget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.5.2.tar ... 
