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;
}
}