Java学习笔记之编程题

1.

/**
*	链表结构
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
//链表逆向输出
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> result = new ArrayList<>();
        ListNode tmp = listNode;//这里是为了后面循环tmp作为判断条件
        while(tmp!=null){
            result.add(0,tmp.val);//这里是往集合头部(0号位)插入链表的值,这样先插入的就在后面,ArrayList默认是在末尾插入值
            tmp = tmp.next;//下一个节点再次作为循环判断条件,直到链表遍历完毕
        }
        return result;
    }

2.在方法中传递进来的参数如果是引用型,不能直接使用,需要先对该参数做判断
比如下图:
因为这里pre有可能为null,下面直接获取它的0号元素肯定就会报错
Java学习笔记之编程题_第1张图片
3.遇到斐波那契数列类的问题
使用动态规划,先把特殊情况处理了。

public int Fibonacci(int n) {//n代表有多少项,这里从0开始
        //0,1,1,2,3,5,8,13,21,34,55,89
        if(n==0){
            return 0;
        }
        if(n==1||n==2){
            return 1;
        }
        int [] value = new int[n+1];
        value[0] = 0;
        value[1] = 1;
        value[2] = 1;
        for(int i=3;i<=n;i++){
            value[i] = value[i-1]+value[i-2];
        }
        return value[n];
    }

1. 二进制 &符号
&:当数字用二进制表示时,两个数做&运算,只有当每个位都是1才为1,二进制中1表示真,0表示假。

//1:0000 0001  //2:0000 0010   //3:0000 0011
//15:0000 1111  //14:0000 1110  //13:0000 1101
//12:0000 1100  //11:0000 1011  //10:0000 1010
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
public int two(int n) {
	int count = 0;
    while(n!= 0){
        count++;
        n = n & (n - 1);
     }
	return count;
}

你可能感兴趣的:(Java学习笔记,其他)