摘要
在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;
}
}