剑指offer 34-66题

面试题34:二叉树中和为某一值的路径

import java.util.Stack;
public class test34 {
    public static Stack<Node> path = new Stack<>();
    public static class Node{
        int item;
        Node left, right;
        public Node(int item){
            this.item = item;
        }
    }
    public static void findPath(Node h, int target, int weight){
        if (h == null || weight > target) return;
        path.push(h);
        weight += h.item;
        if (weight == target && h.left == null && h.right == null) {
            for (Node x: path){
                System.out.printf("%d ", x.item);
            }
            System.out.println();
            path.pop();
        }
        else if (weight < target){
            findPath(h.left,target,weight);
            findPath(h.right,target,weight);
            path.pop();
        }
    }
    public static void main(String[] args){
        Node root = new Node(10);
        root.left = new Node(5);
        root.right = new Node(12);
        root.left.left = new Node(4);
        root.left.right = new Node(7);
        findPath(root,22,0);
    }
}

面试题35:复杂链表的复制

public class test35 {
    public class Node{
        int val;
        Node next, random;
    }
    public static Node clone(Node h) {
        if (h == null) return null;
        Node current = h;
        while (current != null) {
            Node temp = new Node(current.item);
            temp.next = current.next;
            current.next = temp;
            current = temp.next;
        }
        current = h;
        while (current != null) {
            Node temp = current.next;
            if (current.random != null) {
                temp.random = current.random.next;
            }
            current = temp.next;
        }
        current = h;
        Node cloneHead = current.next;
        Node clonecurrent = current.next;
        while (current != null) {
            current.next = clonecurrent.next;
            clonecurrent.next = current.next.next;
            current = current.next;
            clonecurrent = clonecurrent.next;
        }
        return cloneHead;
    }
}

面试题36:二叉搜索树与双向链表

public class test36 {
    private static Node root;
    private static class Node{
        int item;
        Node left, right;
        public Node(int item){
            this.item = item;
        }
    }
    public static Node convert(Node h){
        if (h == null) return null;
        Node last = null;
        last = convert(h, last);
        Node head = last;
        while (head.left != null)
            head = head.left;
        return head;
    }
    public static Node convert(Node root, Node last) {
        if (root == null) return last;
        last = convert(root.left, last);
        if (last != null) {
            last.right = root;
            root.left = last;
        }
        last = root;
        last = convert(root.right, last);
        return last;
    }
}

面试题37:序列化二叉树

import java.util.LinkedList;
import java.util.Queue;
public class test37 {
    public static class TreeNode{
        int val;
        TreeNode left, right;
        public TreeNode(int val){
            this.val = val;
        }
    }
    public static String Serialize(TreeNode h){
        if (h == null) return null;
        StringBuilder str = new StringBuilder();
        Serialize(h, str);
        return str.toString();
    }
    public static void Serialize(TreeNode h, StringBuilder str){
        if (h == null){
            str.append("#,");
            return;
        }
        str.append(h.val + ",");
        Serialize(h.left, str);
        Serialize(h.right, str);
    }
    public static void Deserialize(String str){
        if (str == null) return;
        String[] string = str.split(",");
        Queue<String> queue = new LinkedList<>();
        for (int i = 0; i < string.length; i++){
            queue.add(string[i]);
        }
        Deserialize(queue);
    }
    public static TreeNode Deserialize(Queue<String> queue){
        if (queue.isEmpty()) return null;
        String s = queue.poll();
        if (s.equals("#")) return null;
        TreeNode root = new TreeNode(Integer.valueOf(s));
        root.left = Deserialize(queue);
        root.right = Deserialize(queue);
        return root;
    }
}

面试题38:字符串的排列

类似的字符串排列参见面试题17的方案2

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class test38 {
    public ArrayList<String> Permutation(String str){
        if (str == null) return null;
        List<String> list = new ArrayList<>();
        char[] s = str.toCharArray();
        resolve(s, 0, list);
        Set<String> set = new TreeSet<>(list);
        list = new ArrayList<>(set);
        return (ArrayList<String>) list;
    }
    private void resolve(char[] str, int index, List<String> list){
        if (index == str.length-1){
            list.add(String.valueOf(str));
            return;
        }
        for (int i = index; i < str.length; i++){
            char temp = str[index];
            str[index] = str[i];
            str[i] = temp;
            resolve(str, index+1, list);
            temp = str[index];
            str[index] = str[i];
            str[i] = temp;
        }
    }
    public static void main(String[] args){
        String str = new String("abc");
        for (String s: new Solution().Permutation(str))
            System.out.println(s);
    }
}

还有一种解法,用到了队列和栈

public class test38 {
    
    public static void main(String[] args) {
        String input = "abc";
        Queue<Character> queue = new LinkedList<>();
        for (int i = 0; i < input.length(); i++) {
            queue.add(input.charAt(i));
        }
        permutation(queue, new Stack<>());
    }

    public static void permutation(Queue<Character> queue, Stack<Character> stack) {
        if (queue.isEmpty()) {
            System.out.println(stack);
        }
        for (int i = 0; i < queue.size(); i++) {
            char element = queue.poll();
            stack.push(element);
            permutation(queue, stack);
            queue.add(element);
            stack.pop();
        }
    }
    
}
扩展问题:求字符的所有组合
public class test38 {
    
    public static void main(String[] args) {
        String input = "abc";
        for (int j = 1; j <= input.length(); j++) {
            Queue<Character> queue = new LinkedList<>();
            for (int i = 0; i < input.length(); i++) {
                queue.add(input.charAt(i));
            }
            permutation2(j, queue, new Stack<>());
        }
    }

    public static void permutation2(int N, Queue<Character> queue, Stack<Character> stack) {
        if (N == 0) {
            System.out.println(stack);
            return;
        }
        if (queue.isEmpty()) {
            return;
        }
        char element = queue.poll();
        stack.push(element);
        permutation2(N-1, queue, stack);
        stack.pop();
        permutation2(N, queue, stack);
    }
}

面试题39:数组中出现次数超过一半的数字

public class test39 {
    public static void main(String[] args){
        int[] a = new int[]{1,2,3,2,2,2,5,4,2};
        resolve(a);
    }
    public static void resolve(int[] a){
        int count = 1;
        int number = a[0];
        for (int i = 1; i < a.length; i++){
            if (a[i] == number) {
                count++;
            }
            else {
                count--;
                if (count == 0){
                    number = a[i];
                    count = 1;
                }
            }
        }
        if (!CheckMoreThanHalf(a, number)) {
            System.out.println("null");
            return;
        }
        System.out.println(number);
    }
    public static boolean CheckMoreThanHalf(int[] a, int number){
        int count = 0;
        for (int i = 0; i < a.length; i++){
            if (a[i] == number)
                count++;
            if (count*2>=a.length)
                return true;
        }
        return false;
    }
}

面试题40:最小的k个数

方案1:基于快速排序的partition方法,时间复杂度为O(n)

public class test40 {
    public static void main(String[] args){
        int[] a = new int[]{4,5,1,6,2,7,3,8};
        int n = 4;
        int start = 0, end = a.length-1;
        int index = partition(a, start, end);
        while (index != n){
            if (index < n){
                end = index - 1;
                index = partition(a, start, end);
            }
            else {
                start = index + 1;
                index = partition(a, start, end);
            }
        }
    }
    public static int partition(int[] a, int lo, int hi){
        int v = a[lo];
        int i = lo, j = hi+1;
        while (true){
            while (a[++i] < v){
                if (i == hi) break;
            }
            while (v < a[--j]){
                if (j == lo) break;
            }
            if (i >= j) break;
            exch(a, i, j);
        }
        exch(a, lo, j);
        return j;
    }
    public static void exch(int[] a, int i, int j){
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

方案2:基于红黑树或优先队列,适合于海量数据,时间复杂度为O(nlogk)

import java.util.ArrayList;
import java.util.Collections;
import java.util.PriorityQueue;
import java.util.Queue;
public class test40 {
    public static ArrayList<Integer> main(String[] args){
        int[] a = new int[]{4,5,1,6,2,7,3,8};
        int n = 4;
        return resolve(a, 4);
    }
    public static ArrayList<Integer> resolve(int[] a, int k){
        ArrayList<Integer> list = new ArrayList<>();
        if (a == null || k <= 0 || k > a.length) return null;
        Queue<Integer> queue = new PriorityQueue<>(k, Collections.reverseOrder());
        for (int i = 0; i < a.length; i++){
            if (queue.size() < k){
                queue.add(a[i]);
            }
            else {
                if (a[i] < queue.peek()){
                    queue.remove();
                    queue.add(a[i]);
                }
            }
        }
        for (int i: queue){
            list.add(i);
        }
        return list;
    }
}

面试题41:数据流中的中位数

public class Solution {
    BST tree = new BST();
    static final boolean RED = true, BLACK = false;

    public void Insert(Integer num) {
        tree.put(num);
    }

    public Double GetMedian() {
        return tree.getmid();
    }
    
    public class BST{
        private Node root;
        private class Node{
            int val;
            Node left, right;
            int N;
            boolean color;
            public Node(int val, int N, boolean color){
                this.val = val;
                this.N = N;
                this.color = color;
            }
        }
        public boolean isEmpty(){return root == null;}
        public boolean isRED(Node h){
            if (h == null) return false;
            return h.color == RED;
        }
        public int size(Node h){
            if (h == null) return 0;
            return h.N;
        }
        public double getmid(){
            if (root == null) return 0.0;
            int l = size(root.left);
            int r = size(root.right);
            int mid = (l+r+1)/2;
            if ((l+r+1)%2!=0) return (double) select(mid);
            else return (double) (select(mid-1)+select(mid))/2;
        }
        public int select(int k){
            return select(root, k);
        }
        public int select(Node h, int k){
            if (h == null) return 0;
            int t = size(h.left);
            if (t > k) return select(h.left, k);
            else if (t == k) return h.val;
            else {
                return select(h.right, k-t-1);
            }
        }
        public Node rotateLeft(Node h){
            Node x = h.right;
            h.right = x.left;
            x.left = h;
            x.N = h.N;
            x.color = h.color;
            h.N = size(h.left) + size(h.right) + 1;
            h.color = RED;
            return x;
        }
        public Node rotateRight(Node h){
            Node x = h.left;
            h.left = x.right;
            x.right = h;
            x.N = h.N;
            x.color = h.color;
            h.N = size(h.left) + size(h.right) + 1;
            h.color = RED;
            return x;
        }
        public void flipColors(Node h){
            h.color = !h.color;
            h.left.color = !h.left.color;
            h.right.color = !h.right.color;
        }
        public void put(int val){
            root = put(root, val);
            root.color = BLACK;
        }
        private Node put(Node h, int val){
            if (h == null) return new Node(val, 1, RED);
            if (val < h.val) h.left = put(h.left, val);
            else if (val == h.val) h.val = val;
            else h.right = put(h.right, val);
            if (!isRED(h.left) && isRED(h.right)) h = rotateLeft(h);
            if (isRED(h.left) && isRED(h.left.left)) h = rotateRight(h);
            if (isRED(h.left) && isRED(h.right)) flipColors(h);
            h.N = size(h.left) + size(h.right) + 1;
            return h;
        }
    }
}

面试题42:连续子数组的最大和

方案1:举例分析数组规律

public class test42 {
    public static void main(String[] args){
        int[] a = new int[]{1,-2,3,10,-4,7,2,-5};
        resolve(a);
    }
    public static void resolve(int[] a){
        if (a == null){
            System.out.println(0);
            return;
        }
        int maxsum = a[0];
        int sum = a[0];
        for (int i = 1; i < a.length; i++){
            if (sum <= 0){
                sum = a[i];
            }
            else {
                sum += a[i];
            }
            if (sum > maxsum){
                maxsum = sum;
            }
        }
        System.out.println(maxsum);
    }
}

方案2:动态规划

public class test42 {
    public static void main(String[] args){
        int[] a = new int[]{1,-2,3,10,-4,7,2,-5};
        resolve(a);
    }
    public static void resolve(int[] a){
        if (a == null) return;
        int[] dp = new int[a.length];
        for (int i = 0; i < a.length; i++){
            if (i == 0 || dp[i-1] < 0) dp[i] = a[i];
            else dp[i] = dp[i-1] + a[i];
        }
        int max = dp[0];
        for (int i = 1; i < a.length; i++){
            if (dp[i] > max)
                max = dp[i];
        }
        System.out.println(max);
    }
}

面试题43:1~n整数中1出现的次数

public class test43 {
    public static void main(String[] args){
        System.out.println(NumberOf1Between1AndN_Solution(12));
    }
    public static int NumberOf1Between1AndN_Solution(int n) {
        int ones = 0;
        for (int m = 1; m <= n; m*=10){
            int a = n/m, b = n%m;
            if (a%10==0) ones += a/10 * m;
            else if (a%10==1) ones += (a/10*m) + (b+1);
            else ones += (a/10+1)*m;
        }
        return ones;
    }
}

面试题44:数字序列中某一位的数字

面试题45:把数组排成最小的数

面试题46:把数字翻译成字符串

面试题47:礼物的最大价值(动态规划)

public class test47 {
    public static void main(String[] args){
        int[][] a = new int[][]{{1,10,3,8},{12,2,9,6},{5,7,4,11},{3,7,16,5}};
        resolve(a);
    }
    public static void resolve(int[][] a){
        if (a == null) return;
        int row = a.length, col = a[0].length;
        for (int i = row - 2; i >= 0; i--){
            a[i][col-1] += a[i+1][col-1];
        }
        for (int j = col - 2; j >= 0; j--){
            a[row-1][j] += a[row-1][j+1];
        }
        for (int i = row-2; i >= 0; i--){
            for (int j = col-2; j >= 0; j--){
                a[i][j] += Integer.max(a[i+1][j], a[i][j+1]);
            }
        }
        System.out.println(a[0][0]);
    }
}

面试题48:最长不含重复字符的子字符串(动态规划)

public class test48 {
    public static void main(String[] args){
        String str = new String("arabcacfr");
        resolve(str);
    }
    public static void resolve(String str){
        if (s == null) {
            return -1;
        }
        int[] positionIndex = new int[26];
        for (int i = 0; i < 26; i++) {
            positionIndex[i] = -1;
        }
        int[] dp = new int[s.length()];
        dp[0] = 1;
        positionIndex[s.charAt(0) - 'a'] = 0;
        for (int i = 1; i < s.length(); i++) {
            int dist = i - positionIndex[s.charAt(i) - 'a'];
            if (positionIndex[s.charAt(i) - 'a'] == -1 || dist > dp[i-1]) {
                dp[i] = dp[i-1] + 1;
            } else if (dist == dp[i-1]){
                dp[i] = dp[i-1];
            } else {
                dp[i] = dist;
            }
            positionIndex[s.charAt(i) - 'a'] = i;
        }
        int max = dp[0];
        for (int i = 1; i < s.length(); i++) {
            if (dp[i] > max) {
                max = dp[i];
            }
        }
        return max;
    }
}

面试题49:丑数

public class test49 {
    public static void main(String[] args){
        int n = 1500;
        resolve(n);
    }
    public static void resolve(int n){
        if (n <= 0) return;
        int[] a = new int[n];
        a[0] = 1;
        int t2 = 0, t3 = 0, t5 = 0;
        for (int i = 1; i < n; i++){
            a[i] = Integer.min(a[t2]*2, Integer.min(a[t3]*3, a[t5]*5));
            if (a[i] == a[t2]*2) t2++;
            if (a[i] == a[t3]*3) t3++;
            if (a[i] == a[t5]*5) t5++;
        }
        System.out.println(a[n-1]);
    }
}

面试题50:第一次只出现一次的字符

无论是字符串还是字符流中第一次只出现一次的字符,解决办法都基于哈希表,时间复杂度为O(n),空间复杂度为O(1)

import java.util.LinkedHashMap;
public class test50 {
    public static void main(String[] args){
        String str = new String("abaccdeff");
        resolve(str);
    }
    public static void resolve(String str){
        if (str == null) return;
        char[] s = str.toCharArray();
        LinkedHashMap<Character, Integer> hash = new LinkedHashMap<>();
        for (int i = 0; i < s.length; i++){
            if (hash.containsKey(s[i])){
                hash.put(s[i], hash.get(s[i])+1);
            }
            else hash.put(s[i], 1);
        }
        for (char key: hash.keySet()){
            if (hash.get(key) == 1){
                System.out.println(key);
                return;
            }
        }
    }
}

面试题51:数组中的逆序对

自底向上的归并排序中的子问题

public class test51 {
    public static class Merge{
        int count = 0;
        public int[] aux;
        public void sort(int[] a){
            if (a == null) return;
            aux = new int[a.length];
            sort(a, 0, a.length-1);
        }
        private void sort(int[] a, int lo, int hi){
            if (lo >= hi) return;
            int mid = lo+(hi-lo)/2;
            sort(a,lo,mid);
            sort(a,mid+1,hi);
            merge(a, lo, mid, hi);
        }
        private void merge(int[] a, int lo, int mid, int hi){
            int i = lo, j = mid+1;
            for (int k = lo; k <= hi; k++){
                aux[k] = a[k];
            }
            for (int k = lo; k <= hi; k++){
                if (i == mid+1) a[k] = aux[j++];
                else if (j == hi+1) a[k] = aux[i++];
                else if (aux[i] > aux[j]) {
                    count+=(j-k);
                    a[k] = aux[j++];
                }
                else {
                    a[k] = aux[i++];
                }
            }
        }
    }
    public static void main(String[] args){
        int[] a = new int[]{7,5,6,4};
        Merge merge = new Merge();
        merge.sort(a);
        System.out.println(merge.count);
    }
}

面试题52:两个链表的第一个公共节点

public class test52 {
    public static class Node{
        int key;
        Node next;
    }
    public static void main(String[] args){
        Node node1 = new Node();
        Node node2 = new Node();
        Node same = resolve(node1, node2);
    }
    public static Node resolve(Node node1, Node node2){
        if (node1 == null || node2 == null) return null;
        Node current = node1;
        int length1 = 1, length2 = 1;
        while (current.next != null){
            length1++;
            current = current.next;
        }
        current = node2;
        while (current.next != null){
            length2++;
            current = current.next;
        }
        for (int i = 0; i < Math.abs(length1-length2); i++){
            if (length1 > length2){
                node1 = node1.next;
            }
            else if (length2 > length1){
                node2 = node2.next;
            }
        }
        while (node1.next != null && node2.next != null && node1 != node2){
            node1 = node1.next;
            node2 = node2.next;
        }
        return node1;
    }
}

面试题53:在排序数组中查找数字

题目一:数字在排序数组中出现的次数

public class test53 {
    public static void main(String[] args){
        int[] a = new int[]{1};
        int target = 3;
        System.out.println(resolve(a, target));
    }
    public static int resolve(int[] a, int n){
        if (a == null) return -1;
        int first = getFirst(a, n, 0, a.length-1);
        int last = getLast(a, n, 0, a.length-1);
        if (first <= last && first >= 0 && last >= 0) return last - first + 1;
        else return -1;
    }
    public static int getFirst(int[] a, int target, int start, int end){
        while (start <= end){
            int mid = start + (end - start)/2;
            if (a[mid] > target){
                end = mid-1;
                continue;
            }
            else if (a[mid] < target){
                start = mid+1;
                continue;
            }
            else {
                if (a[mid-1] == target){
                    end = mid-1;
                    continue;
                }
                else return mid;
            }
        }
        return -1;

    }
    public static int getLast(int[] a, int target, int start, int end){
        while (start <= end && start>=0 && end>=0){
            int mid = start + (end - start)/2;
            if (a[mid] > target){
                end = mid+1;
                continue;
            }
            else if (a[mid] < target){
                start = mid-1;
                continue;
            }
            else {
                if (a[mid+1] == target){
                    start = mid+1;
                    continue;
                }
                else return mid;
            }
        }
        return -1;
    }
}

题目二:0~n-1中缺失的数字

public class test53 {
    public static void main(String[] args){
        int[] a = new int[]{};
        System.out.println(resolve(a));
    }
    public static int resolve(int[] a){
        if (a == null) return -1;
        int start = 0, end = a.length-1;
        while (start <= end){
            int mid = start + (end-start)/2;
            if (a[mid] == mid){
                start = mid+1;
                continue;
            }
            else if (a[mid] > mid){
                if (a[mid-1] == mid-1) return mid;
                end = mid-1;
                continue;
            }
        }
        return -1;
    }
}

面试题54:二叉搜索树的第k大节点

public class test54 {
    public static class Node{
        int val;
        Node left, right;
    }
    public static void main(String[] args){
        Node root = new Node();
        int k = 4;
        resolve(root, k);
    }
    public static void resolve(Node h, int k){
        if (h == null) return;
        resolve(h.left, k);
        if (--k == 0) System.out.println(h.val);
        resolve(h.right, k);
    }
}

面试题55:二叉树的深度

题目一:二叉树的深度

public class test55 {
    public static class Node{
        int val;
        Node left, right;
    }
    public static void main(String[] args){
        Node root = new Node();
        System.out.println(depth(root));
    }
    public static int depth(Node h){
        if (h == null) return 0;
        int l = depth(h.left);
        int r = depth(h.right);
        return l>r?(l+1):(r+1);
    }
}

题目二:平衡二叉树

public class test55 {
    public static boolean isbalance = true;
    public static class Node{
        int val;
        Node left, right;
    }
    public static void main(String[] args){
        Node root = new Node();
        if (root == null) {
            System.out.println("false");
            return;
        }
        System.out.println(isBalanced(root, 0));
    }
    public static int isBalanced(Node h, int depth){
        if (h == null) {
            return 0;
        }
        int l = isBalanced(h.left, depth);
        int r = isBalanced(h.left, depth);
        if (Math.abs(l-r) > 1){
            isbalance = false;
        }
        return l>r?(l+1):(r+1);
    }
}

面试题56:数组中数字出现的次数

题目一:数组中只出现一次的两个数字

public class test56 {
    public static void main(String[] args){
        int[] a = new int[]{2,4,3,6,3,2,5,5};
        resolve(a);
    }
    public static void resolve(int[] a){
        if (a==null) return;
        int result = 0;
        for (int i = 0; i < a.length; i++){
            result ^= a[i];
        }
        int index = find(result);
        int num1 = 0, num2 = 0;
        for (int i = 0; i < a.length; i++){
            if (isbit(a[i], index)) num1 ^= a[i];
            else num2 ^= a[i];
        }
        System.out.printf("%d, %d", num1, num2);
    }
    public static int find(int num){
        int index = 0;
        while ((num&1)==0 && index < 32){
            num=num>>1;
            index++;
        }
        return index;
    }
    public static boolean isbit(int num, int index){
        num = num >> index;
        return (num&1) == 0;
    }
}

题目二:数组中唯一只出现一次的数字

public class test56 {
    public static void main(String[] args){
        int[] a = new int[]{2,4,4,4,3,3,3,5,5,5};
        resolve(a);
    }
    public static void resolve(int[] a) {
        if (a == null) return;
        int[] result = new int[32];
        for (int i = 0; i < a.length; i++){
            int bit = 1;
            for (int j = 31; j >= 0; j--){
                if ((a[i]&bit) != 0){
                    result[j]+=1;
                }
                bit=bit<<1;
            }
        }
        int num = 0;
        for (int i = 0; i < result.length; i++){
            if (result[i] % 3 != 0){
                num++;
                num=num<<1;
            }
        }
        System.out.println(num);
    }
}

面试题57:和为s的数字

题目一:和为s的两个数字

public class test57 {
    public static void main(String[] args){
        int[] a = new int[]{1,2,4,7,11,15};
        int n = 15;
        resolve(a, n);
    }
    public static void resolve(int[] a, int n){
        if (a == null || a[0]+a[a.length-1] < n || a[0] > n) return;
        int lo = 0, hi = a.length-1;
        while (lo < hi){
            if (a[lo] + a[hi] == n){
                System.out.printf("%d, %d", a[lo], a[hi]);
                return;
            }
            else if (a[lo] + a[hi] < n){
                lo++;
                continue;
            }
            else {
                hi--;
                continue;
            }
        }
        return;
    }
}

题目二:和为s的连续正数序列

public class test57 {
    public static void main(String[] args){
        int n = 15;
        resolve(n);
    }
    public static void resolve(int n){
        if (n<=2) return;
        int lo = 1, hi = 2;
        while (lo < hi && hi < n){
            if (sum(lo, hi) == n){
                System.out.printf("%d~%d\n", lo, hi);
                hi++;
            }
            else if (sum(lo, hi) < n){
                hi++;
                continue;
            }
            else {
                lo++;
                continue;
            }
        }
        return;
    }
    public static double sum(int lo, int hi){
        int count = hi - lo + 1;
        return (lo+hi)*count/2;
    }
}

面试题58:翻转字符串

题目一:翻转单词顺序

public class test58 {
    public static void main(String[] args){
        String s = new String("I am a student.");
        resolve(s);
    }
    public static void resolve(String s){
        if (s == null) return;
        String[] str = s.split(" ");
        for (int i = str.length-1; i >= 0; i--){
            System.out.print(str[i]);
            System.out.print(" ");
        }
    }
}

题目二:左旋转字符串

public class test58 {
    public static void main(String[] args){
        String s = new String("abcdefg");
        int n = 2;
        resolve(s, n);
    }
    public static void resolve(String s, int n){
        if (s == null || n < 0 || n > s.length()) return;
        char[] string = s.toCharArray();
        Reverse(string, 0, n-1);
        Reverse(string, n, string.length-1);
        Reverse(string, 0, string.length-1);
        System.out.print(String.valueOf(string));
    }
    public static void Reverse(char[] string, int lo, int hi){
        while (lo < hi){
            char temp = string[lo];
            string[lo] = string[hi];
            string[hi] = temp;
            lo++;
            hi--;
        }
    }
}

面试题63:股票的最大利润

public class test63 {

    public static void main(String[] args) {
        int[] input = new int[]{9, 11, 8, 5, 7, 12, 16, 14};
        int max = getMaxDiff(input);
        System.out.println(max);
    }

    public static int getMaxDiff(int[] input) {
        if (input == null || input.length <= 1) {
            return -1;
        }
        int min = input[0];
        int maxDiff = -1;
        for (int i = 1; i < input.length; i++) {
            if (input[i] - min > maxDiff) {
                maxDiff = input[i] - min;
            }
            if (input[i] < min) {
                min = input[i];
            }
        }
        return maxDiff;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容