leetcode算法题(没事就更)

摘要

在b站看到一套算法课,打算比较系统的学习一下。主要是leetcode的算法题,代码按视频写的,思路相同细节处可能有些不同。
b站传送门

1.链表反转-迭代

public class Main {
	static class listnode{
		int node;
		listnode next;
		
		listnode(int node,listnode next){
			this.node=node;
			this.next=next;
		}
	}
	
	public static void main(String[] args) {
		listnode node5=new listnode(5,null);
		listnode node4=new listnode(4,node5);
		listnode node3=new listnode(3,node4);
		listnode node2=new listnode(2,node3);
		listnode node1=new listnode(1,node2);
		System.out.print("反转前:");
		printlistnode(node1);
		listnode t=fz(node1);
		System.out.print("反转后:");
		printlistnode(t);
	}
	static listnode fz(listnode node) {
		listnode tmp1=null,tmp2;
		while(node!=null) {
			tmp2=node.next;
			node.next=tmp1;
			tmp1=node;
			node=tmp2;
		}
		
		return tmp1;
	}
	static void printlistnode(listnode node) {
		while(node!=null) {
			System.out.print(node.node+" ");
			node=node.next;
		}
		System.out.println();
	}
}

2.链表反转-递归

public class Main{
	static class listnode{
		int node;
		listnode next;
		listnode(int node,listnode next){
			this.node=node;
			this.next=next;
		}
	}
	
	public static void main(String[] args) {
		listnode node5=new listnode(5,null);
		listnode node4=new listnode(4,node5);
		listnode node3=new listnode(3,node4);
		listnode node2=new listnode(2,node3);
		listnode node1=new listnode(1,node2);
		System.out.print("反转前:");
		printlistnode(node1);
		listnode t=fz(node1);
		System.out.print("反转后:");
		printlistnode(t);
	}
	static listnode fz(listnode node) {
		if(node.next==null) {
			return node ;
		}
		listnode tmp=fz(node.next);
		node.next.next=node;
		node.next=null;
		return tmp;
	}
	static void printlistnode(listnode node) {
		while(node!=null) {
			System.out.print(node.node+" ");
			node=node.next;
		}
		System.out.println();
	}
}

3.素数个数统计-暴力

public class Main {
	public static void main(String[] args) {
		System.out.println(check(100));
	}

	private static int check(int n) {
		int sum=0;
		for(int i=2;i<=n;i++) {
			if(is(i)) {
				sum++;
			}
		}
		return sum;
	}

	private static boolean is(int n) {
		if(n<2) {
			return false;
		}
		for(int i=2;i<=n/i;i++) {
			if(n%i==0) {
				return false;
			}
		}
		return true;
	}
}

4.素数个数统计-埃氏筛

public class Main {
	public static void main(String[] args) {
		System.out.println(eratosthenes(100));
	}

	private static int eratosthenes(int n) {
		int num=0;
		boolean[] is=new boolean[n];
		for(int i=2;i<n;i++) {
			if(!is[i]) {
				num++;
				for(int j=2*i;j<n;j+=i) {
					is[j]=true;
				}
			}
		}
		return num;
	}
}

优化

public class Main {

	public static void main(String[] args) {
		System.out.println(eratosthenes(100));
	}

	private static int eratosthenes(int n) {
		int num=0;
		boolean[] is=new boolean[n];
		for(int i=2;i<n;i++) {
			if(!is[i]) {
				num++;
				for(int j=i*i;j<n;j+=i) {
					is[j]=true;
				}
			}
		}
		return num;
	}
}

5.双指针去除排序数组重复元素

public class Main {
	public static void main(String[] args) {
		int a[]= {0,1,2,2,3,3,4};
		System.out.println(re(a));
		
	}
	private static int re(int[] a) {
		int num=0;
		int t=-1;
		for(int i=0;i<a.length;i++ ) {
			if(a[i]>t) {
				t=a[i];
				num++;
			}
		}
		return num;
	}
}

6.寻找数组的中心下标


public class Main {
	public static void main(String[] args) {
		System.out.println(pivotIndex(new int[] {1,7,3,6,5,6}));
	}

	private static int pivotIndex(int[] a) {
		int sum=0;
		int t=0;
		for(int i:a) {
			sum+=i;
		}
		
		for(int i=0;i<a.length;i++) {
			t+=a[i];
			if(sum==t) {
				return i;
			}
			sum-=a[i];
		}
		return -1;
	}
}

7.x的平方根-二分

public class Main {
	public static void main(String[] args) {
		System.out.println(binarySearch(625));
	}
	
	private static int binarySearch(int x) {
		int index=-1;
		int l=0,r=x;
		while(l<=r) {
			int t=l+(r-l)/2;
			if(t*t<=x) {
				index=t;
				l=t+1;
			}else {
				r=t-1;
			}
		}
		return index;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值