目录
一、双指针
1.合并两个有序数组
题目:
给你两个按 非递减顺序 排列的整数数组 nums1
和 nums2
,另有两个整数 m
和 n
,分别表示 nums1
和 nums2
中的元素数目。
请你 合并 nums2
到 nums1
中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1
中。为了应对这种情况,nums1
的初始长度为 m + n
,其中前 m
个元素表示应合并的元素,后 n
个元素为 0
,应忽略。nums2
的长度为 n
。
代码实现:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
//三个指针
int len1=m-1;//指向nums1末尾有数字的位置
int len2=n-1;//指向nums2末尾有数字的位置
int len=m+n-1;//指向nums1最末尾空的位置
while(len1>=0&&len2>=0){
if(len2<len1){//从后向前存储数据,大的放在后面
nums1[len]=nums1[len1];//存储len1到nums1的len位置
len--;
len1--;
}else{
nums1[len]=nums2[len2];//存储len2到nums1的len位置
len--;
len2--;
}
}
Arrays.sort(nums1);
System.arraycopy(nums2,0,nums1,0,len2+1);//将nums2中剩下的数据从0下标开始储存到nums1中,从0下标开始
}
}
结果:
2.三数之和
题目:
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请
你返回所有和为 0
且不重复的三元组。
注意:答案中不可以包含重复的三元组。
代码实现:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list=new ArrayList<>();
Arrays.sort(nums);//将数组进行正序排序
int n=nums.length;
for(int i=0;i<n;++i){
if(nums[0]>0)//因为数组按照正序排序,若nums[0]>0,后面的数字一定大于零,不会出现三数相加等于零
return list;
if(i > 0 && nums[i] == nums[i-1]) continue;//若nums[i] == nums[i-1]则跳过,防止重复
int x=nums[i];
int left=i+1;//设置左指针,从i+1位置开始,向右移动
int right=n-1;//设置右指针,从n-1位置开始,向左移动
while(left<right){//左指针小于右指针就向下执行
int[] arr=new int[3];
int sum=x+nums[left]+nums[right];
if(sum<0){//sum<0说明nums[left]太小,left增大
left++;
}
else if(sum>0){//sum>0说明sums[right]太大,让right减小
right--;
}else if(sum==0){//sum=0,将x,left,right对应的值赋值给arr数组
arr[0]=x;
arr[1]=nums[left];
arr[2]=nums[right];
list.add(Arrays.asList(arr[0],arr[1],arr[2]));//将数组添加到list中
while(left < right && nums[left+1] == nums[left])//避免重复的三元组
++left;
while (left < right && nums[right-1] == nums[right])
--right;
++left;
--right;
}
}
}
return list;
}
}
结果:
二、蓝桥杯真题练习
1.数列求值
题目:
给定数列 1,1,1,3,5,9,17,⋯1,1,1,3,5,9,17,⋯,从第 44 项开始,每项都是前 33 项的和。
求第 2019032420190324 项的最后 44 位数字。
代码实现:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int a=1;
int b=1;
int c=1;
int d=0;
for(int x=4;x<=20190324;x++) {
d=(a+b+c)%10000;
a=b;
b=c;
c=d;
}
System.out.println(d);
scan.close();
}
}
结果:
2.质数
题目:
我们知道第一个质数是 22、第二个质数是 33、第三个质数是 55……
请你计算第 20192019 个质数是多少?
代码实现:
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int m=0;
loop: for(int j=2;;j++) {
for(int k=2;k<=j;k++) {
if(j%k==0) {
continue loop;
}
}
m++;
if(m==2019){
System.out.println(j);
break;
}
}
scan.close();
}
}
结果:
3.饮料换购
题目:
乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊 C 型饮料,凭 3 个瓶盖可以再换一瓶 C 型饮料,并且可以一直循环下去(但不允许暂借或赊账)。
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的 n 瓶饮料,最后他一共能喝到多少瓶饮料。
代码实现:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n=scan.nextInt();
for(int i=3;i<=n;i+=3){
n++;
}
System.out.println(n);
scan.close();
}
}
结果: