蓝桥杯练习四

目录

一、双指针

1.合并两个有序数组

2.三数之和

 二、蓝桥杯真题练习

1.数列求值

2.质数 

 3.饮料换购


一、双指针

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 != ji != 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();
    }
}

结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值