剑指offer--java实现全纪录(更新中)

面试题4 替换空格

 public static void replace(String[] str, int len) {
        if (str == null || len == 0) return;
        int realLen = 0;
        int blank = 0;
        for (int i = 0; i < len; i ++) {
            if (str[i] == "\0") {
                break;
            }
            realLen ++;
            if (str[i] == " ") {
                blank++;
            }

        }
        int newLen = realLen + blank * 2;
        if(newLen > len) return;
        int p1 = realLen;
        int p2 = newLen;
        while(p1 >= 0 && p1 < p2) {
            if(str[p1] == " ") {
                str[p2--] = "0";
                str[p2--] = "2";
                str[p2--] = "%";
            }
            else{
                str[p2--] = str[p1];
            }
            p1--;
        }
    }

 面试题10 数字中1的个数

public static int numberOf1(int n) {
        int count = 0;
        while(n>0) {
            count ++;
            n = (n-1)&n;
        }
        return count;
    }

面试题11 数值的整数次幂

public double myPow(double x, int n) {
        if(n<0) return 1/x * myPow(1/x,-(n+1));
        if(n==0) return 1;
        if(n==2) return x * x;
        if(n%2==0) return myPow( myPow(x, n/2), 2);
        else return x * myPow(myPow(x, n/2), 2);
    }

 

面试题13:在O(1)时间内删除链表结点

public static void delete(ListNode head, ListNode node) {
        if(head == null || node == null) {
            return;
        }
        else if(node.next != null){
            ListNode next = node.next;
            node.val = next.val;
            node.next = next.next;
        }
        else if(head == node) {
            head = null;
            return;
        }
        else {
            ListNode p = head;
            while(p.next!=node) {
                p = p.next;
            }
            p.next = null;
            node = null;
        }

    }

 

面试题16:反转链表

链表的中的所有结点需要指向它的前一个结点,但由于是单链表,所以需要一个指针存储当前结点的前一个结点,为了避免链表断裂,需要一个节点存储当前结点的下一个结点;

链表实现类:

public class ListNode {
    private int value;
    private ListNode next;
    public ListNode(int value) {
        this.value = value;
    }
    public ListNode(int value ,ListNode next) {
        this.value = value;
        this.next = next;
    }
    public ListNode(){
        
    }
}

反转链表:

    public ListNode reverseList(ListNode head) {
        //反转后的表头
     ListNode reversedHead
= null;
//存储当前结点 ListNode cur
= head;
//存储前驱结点 ListNode pre
= null; while(cur != null) {
//存储下一个结点 ListNode next
= cur.next; if(next == null) reversedHead = cur;
//当前结点指向前一个结点(反转) cur.next
= pre;
//pre指针指向当前结点 pre
= cur;
//cur指针指向下一个结点 cur
= next; } return reversedHead; }

面试题20 顺时针打印矩阵

 public void printMatrixInCircle(int[][] array){
        if(array == null)
            return;
        int start = 0;
        while(array[0].length > start*2 && array.length >start*2){
            printOneCircle(array,start);
            start++;
        }
    }
    private void printOneCircle(int[][] array,int start){
        int columns = array[0].length;
        int rows = array.length;
        int endX = columns - 1 - start;
        int endY = rows - 1 - start;
        //从左到右打印一行
        for(int i = start;i <= endX ;i++){
            int number = array[start][i];
            System.out.print(number+",");
        }
        //从上到下打印一列
        if(start <endY){
            for(int i = start +1;i<=endY;i++){
                int number = array[i][endX];
                System.out.print(number+",");
            }
        }
        //从右到左打印一行
        if(start < endX && start < endY){
            for(int i = endX -1;i>=start;i--){
                int number = array[endY][i];
                System.out.print(number+",");
            }
        }
        //从下到上打印一列
        if(start <endY && start <endY -1){
            for(int i =endY -1;i>=start+1;i--){
                int number = array[i][start];
                System.out.print(number+",");
            }
        }
    }

 

面试题 28 字符串全排列

    public static void permutation(String s) {
        if(s == null) return ;
        char[] sArr = s.toCharArray();
        permutation(sArr,0,s.length() - 1);
    }
    public static void permutation(char[] s,int from,int to) {
        if(to <= 1)
            return;
        if(from == to) {
            System.out.println(s);
        } else {
            for(int i=from; i<=to; i++) {
                swap(s,i,from); //交换前缀,使其产生下一个前缀
                permutation(s, from+1, to);
                swap(s,from,i); //将前缀换回,继续做上一个前缀的排列
            }
        }
    }

    public static void swap(char[] s,int i,int j) {
        char tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
    }

面试题31 连续数组的最大和

比较经典的面试题,被问到不只一次

 public static int maxSum (int[] nums) {
        if(nums == null) return Integer.MIN_VALUE;
        int dp[] = new int[nums.length];
        dp[0] = nums[0];
        int max = 0;
        for(int i = 1;i < nums.length;i++) {
            dp[i] = Math.max(nums[i],nums[i]+dp[i-1]);
            max = dp[i]>max?dp[i]:max;
        }
        return max;


    }

  扩展:最大子矩阵和

public int maxSumMatrix(int[][] num) {
        if(num == null) return 0;
        int[][] total = num;
        for(int i = 1;i< num.length;i++) {
            for(int j = 0; j < num.length;j++) {
                total[i][j] += total[i-1][j];
            }
        }
        int max = Integer.MIN_VALUE;
        for(int i = 0; i < num.length;i++) {
            for(int j = i; j < num.length; j++) {
                int[] dp = new int[num[0].length];
                for(int k = 0; k < num[0].length;k++){
                    if(i == 0){
                        dp[k] = num[j][k];
                    }
                    else
                        dp[k] = num[j][k] - num[i-1][k];
                }
                int localMax = maxSum(dp);
                max = localMax > max?localMax:max;
            }
        }
        return max;
    }

 

posted @ 2017-03-02 11:00  冷面君要做个coder  阅读(204)  评论(0编辑  收藏  举报