算法
链表反转-迭代-递归
有序链表1->2->3->4->5
需要其输出反转==>>5->4->3->2->1
1 | //有序链表1->2->3->4->5==>>5->4->3->2->1 链表反转 |
统计n以内的素数个数-暴力-埃氏筛选
素数:只能被1和自身整除的自然数 0,1 除外1
2输入:100
输出:25
1 | package com.hnit.day02; |
删除排序数组中的重复项-双指针
一个有序数组nums,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。
不能使用额外的数组空间,必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。
例如: 输入:[0,1,2,2,3,3,4]
输出:5
双指针算法:
思路:数组完成排序后,我们可以放置两个指针i和j,i为慢指针,j为快指针。
只要当nums[i]==nums[j],我们就增加j来跳过重复项
当nums[i]!=nums[j]时,说明重复项已经跳完,将nums[j]的值赋予nums[i+1],然后i++。
接着重复相同的过程,直到j到达数组的末尾为止。
1 | package com.hnit.day03; |
寻找数组的中心下标
给定一个整数数组nums,请编写一个能够返回数组“中心下标”的方法,
中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果数组不存在中心下标,返回-1。如果数组有多个中心下标,应该返回靠近左边的那一个。
注意:中心下标可能出现在数组的两端。
思路:先统计出整个数组的总和,然后从第一个元素开始叠加。总和递减当前元素,叠加递增当前元素,直到两个值相等。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53package com.hnit.day04;
import java.util.Arrays;
public class ArrayCenterIndex {
public static void main(String[] args) {
System.out.println(pivotIndex2(new int[]{1, 7, 3, 6, 5, 6}));
}
//sum = 28
//i=0 total=1 false sum=27
//i=1 total=8 false sum=20
//i=2 total=11 false sum=17
//i=3 total=17 true return 3
public static int pivotIndex(int[] nums) {
//获取数组元素的总和
int sum = Arrays.stream(nums).sum();
//定义左边元素的总和
int total = 0;
for(int i=0;i<nums.length;i++){
total+=nums[i];
//当前面元素的总和与后面元素的总和相等时,返回下标
if(total==sum){
return i;
}
//将总和减去当前元素,即右边元素的总和
sum = sum -nums[i];
}
//没有中心下标,返回-1
return -1;
}
//思路2:左边元素的总和*2+当前元素=总和
//一旦满足true,返回当前下标
//不满足则当前元素右移,如果找不到则返回-1
public static int pivotIndex2(int[] nums) {
//获取数组元素总和
int sum = Arrays.stream(nums).sum();
//定义左边元素的总和
int total = 0;
for(int i=0;i<nums.length;i++){
if(total*2+nums[i]==sum){
return i;
}
total+=nums[i];
}
//没有中心下标,返回-1
return -1;
}
}
X的平方根-二分查找-牛顿迭代
在不使用sqrt(x)函数的情况下,得到x的平方根整数部分
解法一:二分查找
x的平方根肯定在0,X之间,使用二分查找定位该数字,该数字的平方一定是最接近x的,m平方值如果大于x,则往左边找,小于等于则往右边找
解法二:牛顿迭代
假设平方根是i,则i和x/i必然都是x的因子,而x/i必然等于i,推到出i+x/i=2*i,得出i=(i+x/i)/2
由此得出解法,i可以任取一个值,只要上述公式成立,i必然就是x的平方根,如果不成立,(i+x/i)/2得出的值进行递归,直至得出正确解。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43package day05;
public class SqrtX {
public static void main(String[] args) {
System.out.println(binarySearch(10));
System.out.println(newton(10));
}
//二分法
public static int binarySearch(int x) {
//定义左右指针,以及返回值
int l = 0, r = x, index = -1;
int mid;
while (l < r) {//当左指针小于右指针时
//定义中间值
mid = l + (r - 1) / 2;
//如果中间值的平方值小于等于x
if (mid * mid <= x) {
index = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
return index;
}
//牛顿迭代法
public static int newton(int x) {
if(x==0) return 0;
return (int) sqrt(x,x);
}
public static double sqrt(double i,int x) {
double res = (i+x/i)/2;
if(res==i){
return i;
}else{
return sqrt(res,x);
}
}
}