2020.4.25随笔

2020.4.25随笔

	今天也算是博客的第一天吧,细水长流每天积累一些算法以及个人的学习经验和心得吧`,`简单把今天所学的代码分享一下,当然有很多不是原创,是看了别人的代码,自己写了见解和注释吧,说实话感觉自己很小白,对各路大神唯有景仰之心,但,加油,望前程共勉。

给定一个数组nums,编写函数将所有0移动到数组的末尾,同时保持非0元素的相对顺序

class Solution{
	
	public static void main(String[] args){
		
		int[] nums={1,2,3,0,4,5,6,0};
		
		//记录首次出现0的位置		
		int j=0;
		for(int i=0;i<nums.length;i++){
			if(nums[i]!=0){
				nums[j]=nums[i];
				if(i!=j){
					nums[i]=0;
				}
				//j是0首次出现的位置,如果没有0,数组对应下标的值会赋给自身
				//不care中间过程出现多少个0,只关注首次出现0的位置
				j++;
			}
		}
		System.out.println(nums);
		
		int index = 0;
		for(int i=0;i<nums.length;i++) {
			if(nums[i]!=0) {
				nums[index] = nums[i];
				index++;
			}
		}
		
		for(int i=index;i<nums.length;i++) {
			nums[i] = 0;
		}
	}
	
}

节点指向输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //设置一个为0的空节点
		ListNode pre = new ListNode(0);
        //指向当前节点
		ListNode cur = pre;
		//这个代表的是进位
        int carry = 0;
		//当节点指向不为null的时候,如果为null,说明已经到tail了(尾节点)
        while(l1 != null || l2 != null) {
			/*如果为null,就用0代替,因为有可能两个链表长度一样,当一个
			有下一个节点的时候,另外一个链表可能没有下一个节点,为了使两
			者的位数能够对齐,用0补位
			*/
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;
            //这个就是对位置的求和
			int sum = x + y + carry;
            
			//进位,求商
            carry = sum / 10;
            //取余,对应位的值
			sum = sum % 10;
			//指向下一个节点
            cur.next = new ListNode(sum);
			//下一个节点转为当前节点
            cur = cur.next;
			//不为空,就将下一个节点指向当前节点
            if(l1 != null)                         //这边有可能会有人写成while,那么你只能得到第一个数字
                l1 = l1.next;                      //因为会一直到最后,将null赋给l1,因此输出结果只会看
            if(l2 != null)                         //首位相加的结果
                l2 = l2.next;
        }
			//如果最后结算完了有进位,需要将其指向1
        if(carry == 1) {
            cur.next = new ListNode(carry);
        }
			//因为pre预先设置的是一个为0的空节点,所以需要往后取
        return pre.next;
    }

三数之和

class Solution {
	
    public static List<List<Integer>> threeSum(int[] nums) {
        
		List<List<Integer>> ans = new ArrayList();
        //输入的数组长度
		int len = nums.length;
		//数组为空或者长度小于3
        if(nums == null || len < 3) return ans;
        Arrays.sort(nums); // 排序
        for (int i = 0; i < len ; i++) {
            if(nums[i] > 0) break; // 如果当前数字大于0,则三数之和一定大于0,所以结束循环
            if(i > 0 && nums[i] == nums[i-1]) continue; // 去重                                  假设int[] a = new int[]{-4,-4,-4,-1,0,1,3,8,8};
            int L = i+1;                                                                       //首位是-4,除去首位我们还有8位数,我们可以从这8位里面进行加减
            int R = len-1;                                                                     //就是7+6+5+4+3+2+1即28种方法,现在第二位还是-4,假设我们不去重, 
            while(L < R){                                                                      //我们依旧从剩下的数里进行组合,那么就是6+5+4+3+2+1种即21种方法
                int sum = nums[i] + nums[L] + nums[R];                                         //很明显,之前的28种方法已经包含了这21种方法,所以就算我们得到了
                if(sum == 0){                                                                  //答案,也是与之前重复的,所以我们要去重,continue跳出当前循环
                    ans.add(Arrays.asList(nums[i],nums[L],nums[R]));
                    while (L<R && nums[L] == nums[L+1]) L++; // 去重                           //这边依旧用上面的例子解释,
                    while (L<R && nums[R] == nums[R-1]) R--; // 去重                           //比如-4+(-4)= 8 ,下标为1和下标为2都是-4,我们已经将-4,-4,8
                    L++;                                                                       //放入到集合当中,不需要再放入一个-4,-4,8,注意此时我们L下标位置
                    R--;                                                                       //依旧在1,所以在L++之后需要再次L++,即L为3,此时对应的数为-1
                }                                                                              
                else if (sum < 0) L++;                                                         //假定就从-1开始了,接着上面的,-4+(-1)+ 8 = 3,结果大于3,那我
                else if (sum > 0) R--;                                                         //们要将结果变小,排序过后,右边大,所以右边要变小,即R--,同样
            }                                                                                  //如果结果小于0,那我们取的值就要变大,即L++
        }        
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值