zoukankan      html  css  js  c++  java
  • 高盛昂赛 算法题先写corner case

    【方法】

    字写大点,先注释框架

    class Solution {
        public TreeNode sortedArrayToBST(int[] nums) {
            //TreeNode node = new TreeNode(0);
            //corner case
            if (nums.length == 0) {
                return null;
            }
            TreeNode node = helper(nums, 0, nums.length - 1);// -1 should be noticed ahead
            return node;
        }
        必须要有三个参数,不同的函数才能被称作helper
        public TreeNode helper(int[] nums, int low, int high) {      
        //corner case : low > high
            if (low > high) {
                return null;
            }
            int mid = low + (high - low) / 2;
            TreeNode root = new TreeNode(nums[mid]);
            root.left = helper(nums, low, mid - 1);
            root.right = helper(nums, mid + 1, high);
            要用到函数里给的参数
            return root;
        }
    }

     

    118. Pascal's Trianglclass Solution    

    public List<List<Integer>> generate(int numRows)

    //ini
            List<List<Integer>> triangle = new ArrayList<List<Integer>>();
            
            //cc
            if (numRows <= 0) return triangle; 
                
            //for
            for (int i = 0; i < numRows; i++) {
                List<Integer> row = new ArrayList<Integer>();
                
                for (int j = 0; j < i + 1; j++) {
              //首先写corner case
    if (j == 0 || j == i) { row.add(1); }else { row.add(triangle.get(i - 1).get(j - 1) + triangle.get(i - 1).get(j)); } } //add again
            
    用add方法 triangle.add(new ArrayList(row)); } //return return triangle; } }

     

    plusOne 数组加一,从最后开始进位

    public class Solution {
        /**
         * @param digits: a number represented as an array of digits
         * @return: the result
         */
        public int[] plusOne(int[] digits) {
            //not carry
            int n = digits.length;
            //0 to n-1 whenever
            for (int i = n - 1; i >= 0; i--) {
                if (digits[i] < 9) {
                    digits[i]++;
                    return digits;直接在这里return即可
                }else {
                    digits[i] = 0;
                }
            }
            //carry, need new array
            int[] answer = new int[n + 1];
            answer[0] = 1;
            return answer;
        }
    }

     

    deleteNode

    public class Solution {
        /*
         * @param node: the node in the list should be deletedt
         * @return: nothing
         */
        public void deleteNode(ListNode node) {
            // write your code here
            if (node == null || node.next == null) {
                return ;
            }
    注意删除的是next而不是当前的node ListNode next
    = node.next; node.val = next.val; node.next = next.next; } }

     

    190. Reverse Bits

    public class Solution {
        // you need treat n as an unsigned value
        public int reverseBits(int n) {
            //ini res
            int res = 0;
            
            //for loop: 32 32位数,做移动32次
            for (int i = 0; i < 32; i++) {
                res <<= 1; 左移留出最后一位为0来相加
                if ((n & 1) == 1) res += 1;
                n >>= 1; 右移留出最后一位来操作
            }
            
            return res;
        }
    }

     

    101. Symmetric Tree

     

    class Solution {
        public boolean isSymmetric(TreeNode root) {
            //corner case
            if (root == null) {
                return true;
            }
            return isSymmetricHelper(root.left, root.right);
        }
        
        public boolean isSymmetricHelper(TreeNode left, TreeNode right) {
            //all null
            if (left == null && right == null) {
                return true;
            }
            //one null
            if (left == null || right == null) {
                return false;
            }
            //not same 
            if (left.val != right.val) {
                return false;
            }
            //same
            return isSymmetricHelper(left.left, right.right) && isSymmetricHelper(left.right, right.left);
            //don't forget the function name
        }
    }

     

     

     

    234. Palindrome Linked List 两边开始

     

    public class Solution {
        /**
         * @param head: A ListNode.
         * @return: A boolean.
         */
        public boolean isPalindrome(ListNode head) {
            // corner case
            if (head == null) {
                return true;//true
            }
            //p1 go with p2
            ListNode middle = findMiddle(head);
            middle.next = reverse(middle.next);//
            
            ListNode p1 = head, p2 = middle.next;
            while (p2 != null && p1.val == p2.val) {//order
                p1 = p1.next;
                p2 = p2.next;
            }
            return p2 == null;
        }
        
        private ListNode findMiddle(ListNode head) {
            // corner case
            if (head == null) {
                return null;
            }无处不在的corner case
            ListNode fast = head.next, slow = head; 先走一步
            while (fast != null && fast.next != null) {
                slow = slow.next;
                fast = fast.next.next;
            }
            return slow;
        }
        
        private ListNode reverse(ListNode head) {
            // corner case
            if (head == null) {
                return null;
            }
            ListNode prev = null;
            while (head != null) {
                ListNode temp = head.next;
                head.next = prev;
                prev = head;
                head = temp;
            }
            return prev;
        }
    }

     

     

     

    136. Single Number 出现一次 用异或

     

    class Solution {
        public int singleNumber(int[] nums) {
            //ini n
            int n = 0;
            
            //for loop ^=
            for (int i = 0; i < nums.length; i++) {
                n ^= nums[i]; 不同2次会返回原来的值
            }
            
            //return
            if (n != 0) return n;
            
            return 0;
        }
    }

     

     

     

    169. Majority Element(n/2 times)

     

    class Solution {
        public int majorityElement(int[] nums) {
            //ini
            int major = nums[0];
            int count = 1;
            //1 - n
            for (int i = 1; i < nums.length; i++) {
                //nums[i] != major, count--,if count == 0
                if (nums[i] != major) {
                    if (count == 0) {
                        major = nums[i];
                        count++;
                    }
                    count--;抵消当前的
                }else {
                    //nums[i] == major, count++
                    count++;
                }    
            }
            return major;
        }
    }

    160. Intersection of Two Linked Lists 想想图,对着写就行了

     

    A:          a1 → a2
                       ↘
                         c1 → c2 → c3
                       ↗            
    B:     b1 → b2 → b3

     

     

    public class Solution {
        /*
         * @param headA: the first list
         * @param headB: the second list
         * @return: a ListNode
         */
        public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
            //corner case
            if (headA == null || headB == null) {
                return null;
            }
            //keep the same length
            int A_len = getLength(headA);
            int B_len = getLength(headB);
            
            while (A_len > B_len) {
                headA = headA.next;
                A_len--;
            }
            while (A_len < B_len) {
                headB = headB.next;
                B_len--;
            }
            //find the same node
            while (headA != headB) {
                headA = headA.next;
                headB = headB.next;
            }
            
            return headA;
        }
        
        //getLength
        public int getLength(ListNode node) {
            int length = 0;
            while(node != null) {
                length++;
                node = node.next;
            }
            return length;
        }
    }

    26. Remove Duplicates from Sorted Array

     

    class Solution {
        public int removeDuplicates(int[] nums) {
            if (nums == null || nums.length == 0) {
                return 0;
            }
            int size = 0;
            for (int i = 0; i < nums.length; i++) {
                if (nums[i] != nums[size]) { 总是去和size代表的最后一位相比较
                    nums[++size] = nums[i];
                }
            }
            return size + 1;剩一个0位
        }
    }

     

    387. First Unique Character in a String 

    public class Solution {
        /**
         * @param s: a string
         * @return: it's index
         */
        public int firstUniqChar(String s) {
            //corner case
            if (s == null) {
                return 0;
            }
            //put into cnt[]
            char[] c = s.toCharArray();字母是一个单独的数组
            int[] cnt = new int[256];表示所有字符
            for (int i = 0; i < s.length(); i++) {
                cnt[c[i]]++;
            }
            //return
            for (int i = 0; i < s.length(); i++) {
                if (cnt[c[i]] == 1) {
                    return i;
                    //break;
                }
            }
            return -1;
        }
    }

     

    14. Longest Common Prefix

     

    Input: ["flower","flow","flight"]
    Output: "fl"

     

    public class Solution {
        /**
         * @param strs: A list of strings
         * @return: The longest common prefix
         */
        public String longestCommonPrefix(String[] strs) {
            //corner case
            if (strs == null) {
                return "";
            }
            if (strs.length == 0) {
                return "";
            }
            //define pre
            String pre = strs[0];
            int n = strs.length;
            //shorten pre
            for (int i = 1; i < n; i++) {
                while (strs[i].indexOf(pre) != 0) {
                    pre = pre.substring(0, pre.length() - 1);
                }
            }
            //return
            return pre;
        }
    }

     

    283. Move Zeroes

    class Solution {
        public void moveZeroes(int[] nums) {
            //cc
            if (nums == null || nums.length == 0) return;
            //ini
            int insertPos = 0;
     
            for (int num : nums) {
                //no 0s
                if (num != 0) {
                    nums[insertPos++] = num;
                }
            }
             //0s 分开就行
                while (insertPos < nums.length) {
                    nums[insertPos++] = 0;
                }
            //return
        }
    }

     

    //88. Merge Sorted Array
    //add the bigger number from backward 从后往前

    public class Solution {
        /*
         * @param A: sorted integer array A which has m elements, but size of A is m+n
         * @param m: An integer
         * @param B: sorted integer array B which has n elements
         * @param n: An integer
         * @return: nothing
         */
        public void merge(int[] A, int m, int[] B, int n) {
            // write your code here
            int index = m + n - 1;
            int i = m - 1;
            int j = n - 1;
            //add the bigger number from backward
            while (i >= 0 && j >= 0) {最重要的是这一步
                if (A[i] > B [j]) {
                    A[index--] = A[i--];
                }
                else {
                    A[index--] = B[j--];
                }
            }
            //if there's number remaning in just A or B, append to the result
            while (i >= 0) {
                    A[index--] = A[i--];
                }
            while (j >= 0) {
                    A[index--] = B[j--];
                }
        }
    }

     

     

    Merge Two Sorted Lists 从前往后

     

    public class Solution {
        /*
         * @param l1: ListNode l1 is the head of the linked list
         * @param l2: ListNode l2 is the head of the linked list
         * @return: ListNode head of linked list
         */
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            // write your code here
            ListNode dummy = new ListNode(0);
            ListNode tail = dummy;得用dummy node
            while(l1 != null && l2 != null) {
                if (l1.val < l2.val) {
                    tail.next = l1;
                    l1 = l1.next;
                }
                else {
                    tail.next = l2;
                    l2 = l2.next;
                }
                tail = tail.next;一样的,注意要有主变量
            }
            if (l1 != null) {
                tail.next = l1;
            }
            if (l2 != null) {
                tail.next = l2;
            }
            return dummy.next;
        }
    }

     

     

     

    121. Best Time to Buy and Sell Stock

    //121. Best Time to Buy and Sell Stock
    //use greedy to solve
    class Solution {
        public int maxProfit(int[] prices) {
            if (prices.length == 0 || prices == null) {
                return 0;
            }
            
            int min = Integer.MAX_VALUE;
            int profit = 0;
            //update the min price and the max profit each time
            for (int i = 0; i < prices.length; i++) {
          两个三元运算符 min
    = min < prices[i] ? min : prices[i]; profit没有i = (prices[i] - min) > profit ? prices[i] - min : profit; } return profit; } } //n 1

     

    Reverse Integer: 我不熟悉的对每一位数进行的操作,步骤都是:取数、迭代、改数

    public int reverse(int x) {
            //ini
            int res = 0, newRes = 0;
            
            while (x != 0) {
                int tail = x % 10;先余后除,中间是newres 先背吧
                newRes = res * 10 + tail;
                if ((newRes - tail) / 10 != res) {
                    return 0;
                }
                res = newRes;
                x = x / 10;
            }
            
            //return 
            return newRes;
        }

     

    Maximum Subarray

    class Solution {
        public int maxSubArray(int[] nums) {
            if (nums.length == 0 || nums == null) {
                return -1;
            }
            
            int sum = 0;
            int minSum = 0;
            int max = Integer.MIN_VALUE;
            for (int i = 0; i < nums.length; i++) {
                sum += nums[i];
                max = Math.max(max, sum - minSum);先减之前的
                minSum = Math.min(minSum, sum);
            }
            
            return max;
        }
    }

     

     

     

    Two Sum

     

    class Solution {
        public int[] twoSum(int[] nums, int target) {
            int[] result = new int[2];
            HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
            
            for (int i = 0; i < nums.length; i++) {
                if (map.containsKey(target - nums[i])) {
                    result[0] = map.get(target - nums[i]);模板index
                    result[1] = i;
                    
                    return result;
                }
                map.put(nums[i],i);
            }
            return result;
        }
    }

    Linked List Cycle

    public class Solution {
        /*
         * @param head: The first node of linked list.
         * @return: True if it has a cycle, or false
         */
        public boolean hasCycle(ListNode head) {
            // write your code here
            if (head == null) {
                return false;
            }
            ListNode fast = head.next;
            ListNode slow = head;
            while(fast != slow) {
                if (fast == null || fast.next == null) {
                    return false;
                }
                fast = fast.next.next;
                slow = slow.next;
            }
            
            return true;
        }
    }

     

    Add Two Numbers 从前往后加,carry在最后面

    public class Solution {
        /*
         * @param l1: the first list
         * @param l2: the second list
         * @return: the sum list of l1 and l2 
         */
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            //intialize
            ListNode dummy = new ListNode(0);
            ListNode tail = dummy;//
            //sum
            int carry = 0;
            for (ListNode i = l1, j = l2; i != null || j != null;) {
                int sum = carry;
                sum += (i != null)? i.val: 0;注意一下是否为空再加
                sum += (j != null)? j.val: 0;
                // %
                tail.next = new ListNode(sum % 10);
                tail = tail.next;
                // /
                carry = sum / 10;
                i = (i == null)? i : i.next;//i, j should go down
                j = (j == null)? j : j.next;//judge itself
            }
            //carry 用于最后结尾收尸
            if (carry != 0) {
                tail.next = new ListNode(carry);
            }//turn carry into a node
            
            return dummy.next;//forget
        }
    }

     

    万年不会的翻转链表

     

    class Solution {
        public ListNode reverseList(ListNode head) {
            
            ListNode prev = null;
            ListNode curt = head;
            
            while(curt != null) {
                ListNode temp = curt.next;
                curt.next = prev;
                prev = curt;
                curt = temp;
            }
            return prev;
        }
    }

     

     

     

     

    1. 找两个array不同的element: 就用双重for循环,没有啥高级的办法,就这样!

    public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            int[] arr1 = new int[] { 1, 2, 3, 4, 5, 6 };
            int[] arr2 = new int[] { 5, 6, 7, 8 };
    
            boolean contains = false;
            List<Integer> list = new ArrayList<Integer>();
            for (int i = 0; i < arr1.length; i++) {
                for (int j = 0; j < arr2.length; j++) {
                    if (arr1[i] == arr2[j]) {
                        contains = true;
                        break;
                    }
                }
    
                if(!contains){
                    list.add(arr1[i]);
                }
                else{
                    contains = false;
                }
            }
            System.out.println(list);
    
        }

    2. 怎么实现hashmap,big O是多少

     key- index - bucket[index] array

     

    private int getBucketIndex(K key) 
        { 
            int hashCode = key.hashCode(); 
            int index = hashCode % numBuckets; 
            return index; 
        } 

     

    好像不一样,不用看了

    public class Book implements Comparable<Book>{
    String title, author; int year;
    Book(String title, String author, int year) {
    //the usual stuff
    }
    @Override
    public int compareTo(Book b) {
    return (this.title.compareTo(b.title));
    }
    @Override
    public int hashCode() {  
    return  Objects.hash(title, author, year);
    }
    @Override
    public boolean equals(Object o) { 
    if (o == null) return false;      
    if (this == o) return true;    
    if (getClass() != o.getClass()) return false; 
    Book b = (Book) o; 
    return title.equals(b.title) 
            && author.equals(b.author) 
            && (year == b.year); 
    }}

     


    3. friend circle

    class Solution {
        public int findCircleNum(int[][] M) {
            //corner case
            if (M == null || M.length == 0) return 0;
            
            //initialization: count = n, each id = id
            int m = M.length;
            int count = m;
            int[] roots = new int[m];
            for (int i = 0; i < m; i++) roots[i] = i; 
            
            //for loop and union find
            for (int i = 0; i < m; i++) {
                for (int j = i + 1; j < m; j++) {
                    //if there is an edge, do union find
                    if (M[i][j] == 1) {
    //注意下是怎么来的
    int root0 = find (roots, i); int root1 = find (roots, j); if (root0 != root1) { roots[root1] = root0; count--; } } } } //return count return count; } public int find (int[] roots, int id) { while (id != roots[id]) { id = roots[roots[id]]; } return id; } }

     


    4. 找array倒数第k个element;找array连续element前面的element

     只让我写了一个sql和一个merge sort...我觉得那不算算法题

    mergesort: 新建两个数组,recursively merge之后再拼起来

    //recursive and append
    public static void mergeSort(int[] a, int n) {
        if (n < 2) {
            return;
        }
        int mid = n / 2;
        int[] l = new int[mid];
    //不一定是双倍,要用n-mid
    int[] r = new int[n - mid]; for (int i = 0; i < mid; i++) { l[i] = a[i]; } for (int i = mid; i < n; i++) { r[i - mid] = a[i];
    //for loop里就不用++了 }
    //sort - merge mergeSort(l, mid); mergeSort(r, n
    - mid); merge(a, l, r, mid, n - mid); } public static void merge( int[] a, int[] l, int[] r, int left, int right) { //list 5 variables here int i = 0, j = 0, k = 0; while (i < left && j < right) { if (l[i] < r[j]) { a[k++] = l[i++]; } else { a[k++] = r[j++]; } }
    //should be outside
    while (i < left) { a[k++] = l[i++]; } while (j < right) { a[k++] = r[j++]; } }
    quicksort:移动index, index还是原来的i < j就得交换后继续
    package
    com.java2novice.sorting; public class MyQuickSort { private int array[]; private int length; public void sort(int[] inputArr) { if (inputArr == null || inputArr.length == 0) { return; } this.array = inputArr; length = inputArr.length; quickSort(0, length - 1); } private void quickSort(int lowerIndex, int higherIndex) { int i = lowerIndex; int j = higherIndex; // calculate pivot number, I am taking pivot as middle index number int pivot = array[lowerIndex+(higherIndex-lowerIndex)/2];
    pivot应该是数组中的一个元素
    // Divide into two arrays
    //写完i j的关系之后要写整个数组的recursive while (i <= j) { /** * In each iteration, we will identify a number from left side which * is greater then the pivot value, and also we will identify a number * from right side which is less then the pivot value. Once the search * is done, then we exchange both numbers. */ while (array[i] < pivot) { i++; } while (array[j] > pivot) { j--; }
    //array[i] is bigger than pivot, so exchange and continue
    if (i <= j) { exchangeNumbers(i, j); //move index to next position on both sides i++; j--; } } // call quickSort() method recursively if (lowerIndex < j) quickSort(lowerIndex, j); if (i < higherIndex) quickSort(i, higherIndex); } private void exchangeNumbers(int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } public static void main(String a[]){ MyQuickSort sorter = new MyQuickSort(); int[] input = {24,2,45,20,56,75,2,56,99,53,12}; sorter.sort(input); for(int i:input){ System.out.print(i); System.out.print(" "); } } }

     

    说给100首歌,设计一个shuffle/repeat播放音乐的逻辑.本文原创自1point3acres论坛
    没有写代码,就说了说思路,也并不在乎你用啥语言,我用的python问能不能用buildin func 或者numpy都允许了hhh.

    就用numpy random一个整数范围是0~n然后每次放了这个歌以后直接把这条数据移到最后然后n-1就行,最后n=1的时候播放最后一首歌,同时n再置最开始的那个数值就好。感觉这题是现场出的,说是考数据结构我一开始想用map,还迂回了很久= =。希望不要觉得我笨

     

    【valid parenthesis】
    class Solution {
    public boolean isValid(String s) {
    //corner case
    if (s == null) {
    return true;
    }
    Stack<Character> stack = new Stack<Character>();
    //push into stack
    for (char c : s.toCharArray()) {
    //left cases
    if (c == '(') {
    stack.push(')');
    }else if (c == '[') {

    //每一种都要写
    stack.push(']');
    }else if (c == '{') {
    stack.push('}');
    }else if (stack.isEmpty() || stack.pop() != c) {
    //right case
    return false;
    }
    }
    return stack.isEmpty();
    }
    }

    【invert binary tree】
    class TreeNode {
    int val; TreeNode left, right; //parameter is another item
    TreeNode(int item) { val = item; left = right = null; }}
    class Solution {
    public TreeNode invertTree(TreeNode root) {

    //careful with corner case
    if (root == null) {
    return null;
    }
    TreeNode temp = root.left;
    root.left = invertTree(root.right);
    root.right = invertTree(temp);
    return root;
    }
    }

    【给两个String,找相同的字符】就是双重for循环
    public static void main(String[] args) {

     

    String str1 = "刘烨,孙坚,王二小,蜘蛛侠,钢铁侠,毛剑卿";
    String str2 = "王二小,李占军,刘胡兰,毛剑卿";

     


    String[] arr1 = str1.split(",") ;
    String[] arr2 = str2.split(",") ;
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < arr2.length; i++){
    for (int j = 0; j < arr1.length; j++){
    if (arr1[j].equals(arr2[i])){
    sb.append(arr1[j] + ",") ;
    }
    }
    }
    System.out.println("结果:" + sb.toString().substring(0, sb.toString().length() - 1));

    }
    【reverse vowels】典型双指针了
    class Solution {
    public String reverseVowels(String s) {
    //cc
    if (s == null) {
    return s;
    }
    //ini
    String vowels = "aeiouAEIOU";
    char[] chars = s.toCharArray();
    int start = 0, end = s.length() - 1;

    while (start < end) {
    //adjust start, end
    while (start < end && !vowels.contains(chars[start] + "")) {
    start++;
    }
    while (start < end && !vowels.contains(chars[end] + "")) {
    end--;
    }
    //exchange
    char temp = chars[start];
    chars[start] = chars[end];
    chars[end] = temp;
    //push to move on
    start++;
    end--;
    }

    //return
    return new String(chars);
    }
    }

    【missing number】短路了吧?
    class Solution {
    public int missingNumber(int[] nums) {

    //ini = sort
    Arrays.sort(nums);

    //cc
    if (nums[0] != 0) {
    return 0;
    }

    //for
    for (int i = 0; i < nums.length - 1; i++) {
    //notice
    if (nums[i + 1] != nums[i] + 1) {
    return nums[i] + 1;
    }
    }

    //return
    return nums.length;
    }
    }

    【reverse string】
    class Solution {
    public String reverseString(String s) {
    //corner case
    if (s == null) {
    return null;
    }
    int i = 0, j = s.length() - 1;
    //convert to char[]
    char[] chars = s.toCharArray();
    while (i < j) {
    char temp = chars[i];
    chars[i] = chars[j];
    chars[j] = temp;
    //notice here
    i++;
    j--;
    }
    //convert again
    return new String(chars);
    //return
    }
    }

    【方法2】
    public class Solution {
    public String reverseString(String s) {
    return new StringBuilder(s).reverse().toString();
    }
    }

    【Valid Palindrome】
    public class Solution {
    /**
    * @param s: A string
    * @return: Whether the string is a valid palindrome
    */
    public boolean isPalindrome(String s) {
    //cc
    if (s.isEmpty()) {
    return true;
    }

    //define
    int head = 0, tail = s.length() - 1;

    while (head < tail) {
    char cHead = s.charAt(head), cTail = s.charAt(tail);
    //judge:punction or not
    if (!Character.isLetterOrDigit(cHead)) {
    head++;
    }else if (!Character.isLetterOrDigit(cTail)) {
    tail--;
    }else {
    //tolowercase and judge
    if (Character.toLowerCase(cHead) != Character.toLowerCase(cTail)) {
    return false;
    }
    //continue
    head++;
    tail--;
    }
    }

    //return
    return true;
    }

    【二分法解根号2】
    class Solution {
    public int mySqrt(int x) {
    //bs
    long start = 1, end = x;
    while (start + 1 < end) {
    long mid = start + (end - start) / 2;
    if (mid * mid <= x) {
    start = mid;
    }else {
    end = mid;
    }
    }

    //return end or start
    if (end * end <= x) {
    return (int)end;
    }
    return (int)start;
    }
    }

     

    【斐波那契数列 recursion】
    //Fibonacci Series using Recursion
    class fibonacci
    {
    static int fib(int n)
    {
    if (n <= 1)
    return n;
    return fib(n-1) + fib(n-2);
    }

    public static void main (String args[])
    {
    int n = 9;
    System.out.println(fib(n));
    }
    }
    Time Complexity: T(n) = T(n-1) + T(n-2) which is exponential.

    【Use Dynamic Programming】
    // Fibonacci Series using Dynamic Programming
    class fibonacci
    {
    static int fib(int n)
    {
    /* Declare an array to store Fibonacci numbers. */
    int f[] = new int[n+2]; // 1 extra to handle case, n = 0
    int i;

    /* 0th and 1st number of the series are 0 and 1*/
    f[0] = 0;
    f[1] = 1;

    for (i = 2; i <= n; i++)
    {
    /* Add the previous 2 numbers in the series
    and store it */
    f[i] = f[i-1] + f[i-2];
    }

    return f[n];
    }

    public static void main (String args[])
    {
    int n = 9;
    System.out.println(fib(n));
    }
    }
    //n n

    【井字棋】
    public class TicTacToe {
    private int[] rows;
    private int[] cols;
    private int diagonal;
    private int antiDiagonal;

    /** Initialize your data structure here. */
    public TicTacToe(int n) {
    rows = new int[n];
    cols = new int[n];
    }

    /** Player {player} makes a move at ({row}, {col}).
    @param row The row of the board.
    @param col The column of the board.
    @param player The player, can be either 1 or 2.
    @return The current winning condition, can be either:
    0: No one wins.
    1: Player 1 wins.
    2: Player 2 wins. */
    public int move(int row, int col, int player) {
    int toAdd = player == 1 ? 1 : -1;

    rows[row] += toAdd;
    cols[col] += toAdd;
    if (row == col)
    {
    diagonal += toAdd;
    }

    if (col == (cols.length - row - 1))
    {
    antiDiagonal += toAdd;
    }

    int size = rows.length;
    if (Math.abs(rows[row]) == size ||
    Math.abs(cols[col]) == size ||
    Math.abs(diagonal) == size ||
    Math.abs(antiDiagonal) == size)
    {
    return player;
    }

    return 0;
    }
    }

    【happy number】
    class Solution {
    public boolean isHappy(int n) {
    //cc
    if (n == 0) {
    return false;
    }

    //ini
    int squareSum, remain;
    Set set = new HashSet();

    //while loop, contains

    //每个n 在set中只加一次,不重复
    while (set.add(n)) {
    squareSum = 0;
    //每次加一个n,都重新算squareSum
    while (n > 0) {
    remain = n % 10;
    squareSum += remain * remain;
    n = n / 10;
    }

    if (squareSum == 1) return true;
    n = squareSum;最后才把数字给n
    }

    return false;
    }
    }

    【number permutation】
    public class Solution {
    /*
    * @param nums: A list of integers.
    * @return: A list of permutations.
    */
    public List<List<Integer>> permute(int[] nums) {
    //corner case
    List<List<Integer>> results = new ArrayList<>();//
    List<Integer> permutations = new ArrayList<Integer>();
    HashSet<Integer> set = new HashSet<Integer>();

    if (nums == null) {
    return results;
    }
    if (nums.length == 0) {
    results.add(new ArrayList<Integer>());
    return results;
    }
    //helper
    helper(nums, permutations, set, results);
    return results;
    }

    //helper :NSTRS
    public void helper(int[] nums, int start, List<Integer> temp, List<List<Integer>> results,HashSet<Integer> set用于检验重复) {
    if (permutations.size() == nums.length) {//exit
    results.add(new ArrayList<Integer>(permutations));
    return ; 记得此处要返回,有return
    }

    for (int i = 0; i < nums.length; i++) {

    //continue when there is duplicate 注意重复的情况,这也是一种corner case
    if (set.contains(nums[i])) {
    continue;
    }

    temp.add(nums[i]);
    set.add(nums[i]);
    helper(nums, i+1, temp, results, set);
    set.remove(nums[i]);
    temp.remove(temp.size() - 1);
    }
    }

    位运算

    public ArrayList<String> permute(char[] s, ArrayList<String> list, int index) {
    
            list.add(String.valueOf(s));
            if (index >= s.length)
                return list;
    
            for (int i = index; i < s.length; i++) {
    
                if (Character.isAlphabetic(s[i])) {
    
                    s[i] ^= 32;
                    permute(s, list, i + 1);
                    s[i] ^= 32;
                }
            }
            return list;
    
        }

     


    subset:

    private void backtrack(int [] nums, int start,List<Integer> tempList, List<List<Integer>> list){
    list.add(new ArrayList<>(tempList));
    for(int i = start; i < nums.length; i++){
    tempList.add(nums[i]);
    backtrack(list, tempList, nums, i + 1);
    tempList.remove(tempList.size() - 1);
    }
    }

     

    【search in 2 2D array】
    class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {

    if (matrix == null || matrix.length == 0) {
    return false;
    }
    if (matrix[0] == null || matrix[0].length == 0) {
    return false;
    }

    int m = matrix.length;
    int n = matrix[0].length;
    int x = m - 1;
    int y = 0;
    int count = 0;

    while (x >= 0 && y < n) {
    if (matrix[x][y] > target) {

    大动
    x--;
    }
    else if(matrix[x][y] < target) {

    小动

    y++;
    }
    else {
    count++;
    x--;
    y++;
    }
    }

    if (count > 0) {
    return true;
    }
    return false;
    }
    }

    【group anagrams】
    class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
    //cc
    if (strs == null || strs.length == 0) return new ArrayList<List<String>>();

    //ini: map, char[]
    Map<String, List<String>> map = new HashMap<>();

    //for loop: add to char, to map
    for (String str : strs) {
    char[] chars = str.toCharArray();

    //顺序统一以后都一样
    Arrays.sort(chars);
    String anagram = String.valueOf(chars);

    //then add to map
    if (!map.containsKey(anagram)) map.put(anagram, new ArrayList<String>());
    map.get(anagram).add(str);
    }

    //return (map)
    return new ArrayList<List<String>>(map.values());
    }
    }

    【find second maximum】固定2个数
    // JAVA Code for Find Second largest
    // element in an array
    class GFG {

    /* Function to print the second largest
    elements */
    public static void print2largest(int arr[],
    int arr_size)
    {
    int i, first, second;

    /* There should be atleast two elements */
    if (arr_size < 2)
    {
    System.out.print(" Invalid Input ");
    return;
    }

    first = second = Integer.MIN_VALUE;
    for (i = 0; i < arr_size ; i++)
    {
    /* If current element is smaller than
    first then update both first and second */
    if (arr[i] > first)
    {
    second = first;
    first = arr[i];
    }

    /* If arr[i] is in between first and
    second then update second */
    else if (arr[i] > second && arr[i] != first)
    second = arr[i];
    }

    if (second == Integer.MIN_VALUE)
    System.out.print("There is no second largest"+
    " element ");
    else
    System.out.print("The second largest element"+
    " is "+ second);
    }

    【Find All Duplicates in an Array】

    class Solution {
    public int removeDuplicates(int[] nums) {
    if (nums == null || nums.length == 0) {
    return 0;
    }
    int size = 0;
    for (int i = 0; i < nums.length; i++) {
    if (nums[i] != nums[size]) {

    //compare with the last number
    nums[++size] = nums[i];

    //注意是先加再给
    }
    }
    return size + 1;
    }
    }

    【difference】
    比较基础 递归 迭代:本身、堆栈、基础条件
    基本 函数体中的语句调用函数本身。 允许重复执行指令集
    格式 在递归函数中,仅指定终止条件(基本情况)。 迭代包括初始化,条件,循环内语句的执行以及控制变量的更新(递增和递减)。
    终止 条件语句包含在函数体中,以强制函数返回而不执行递归调用。 重复执行迭代语句,直到达到某个条件。
    条件 如果函数没有收敛到某个称为(基本情况)的条件,则会导致无限递归。 如果迭代语句中的控制条件永远不会变为false,则会导致无限次迭代。
    无限重复 无限递归可能会导致系统崩溃。 无限循环重复使用CPU周期。
    应用的 递归始终应用于函数。 迭代应用于迭代语句或“循环”。
    堆 每次调用函数时,堆栈用于存储一组新的局部变量和参数。 不使用堆栈。
    高架 递归拥有重复函数调用的开销。 没有重复函数调用的开销
    速度 执行缓慢。 快速执行
    代码大小 递归减少了代码的大小。 迭代使代码更长。

    【】

     

  • 相关阅读:
    小酌重构系列[3]——方法、字段的提升和降低
    FPGA实现视频图像的水印添加
    FPGA实现图像中心差分变换
    FPGA实现图像几何变换:缩放
    FPGA实现图像几何变换:平移
    FPGA实现图像几何变换:旋转
    FPGA实现图像几何变换:镜像
    FPGA实现图像几何变换:裁剪
    FPGA实现钢笔画和浮雕效果
    FPGA实现图像的bit平面分层
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9826498.html
Copyright © 2011-2022 走看看