蓝桥杯第四弹

第一题

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
       for(int i=0;i<n;i++){
           
                nums1[i+m]=nums2[i];
           
       }
       Arrays.sort(nums1); 
    }
}

 先将nums2的值都插到nums1的为零的部分,然后直接排序。

第二题

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int nums2[]={0,0,0};
        int n=nums2.length;
        List<List<Integer>> list=new ArrayList<>();
        Arrays.sort(nums2);
        
        for(int i=0;i<n;i++){
            
            for(int j=i+1;j<n;j++){
                if(j>i+1&&nums2[j]==nums2[j-1])
                    continue;
                
                for(int k=j+1;k<n;k++){
                    if(k>j+1&&nums2[k]==nums2[k-1])
                    continue;
                    if(n>3&&i>0){
                if(nums2[i]+nums2[j]+nums2[k]==0&&nums2[i]!=nums2[i-1]){
                        list.add(Arrays.asList(nums2[i],nums2[j],nums2[k]));
                    }
                    }else if(n==3&&nums2[i]+nums2[j]+nums2[k]==0){
                        list.add(Arrays.asList(nums2[i],nums2[j],nums2[k]));
                    }
                    
                    
                }
            }
        }
         return list;
    }
   
}

首先将nums排序,然后对nums进行三阶循环,保证每次循环的i,j,k 都不相同,然后判断此次i,j,k是否与上次相同,若相同,那么就将此次的i跳过,进行下一次循环。因为只要i,j,k每次都不和上次的相同,那就可以保证i,j,k不重复,进而保证得到的元组不重复。

第三题

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
       int num=0;
   int i;
   int m=1,n=1,l=1;
   
   for(i=4;i<=20190324;i++){
     num=(m+n+l)%10000;
     m=n;
     n=l;
     l=num;
    
   }

   System.out.println(num);
     scan.close();
    }
}

 20190324 这个数过于庞大 无论是递归还是迭代 程序都无法正常运行, 而且int 、 long、BigDecimal等都无法、承载这么大的数 ,题目要求我们只取最后四位 , 那我们可以对每次运算出来的结果 %10000 这样每次结果就都保留最后四位数字 

第四题

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int count=1;
        int flag=1;
        for(int i=3;i<20000;i++){
          flag=1;
          for(int j=2;j<i;j++){
            if(i%j==0){
              flag=0;
              break;
            }

          }
          if(flag==1&&count<2019){

            count++;
            if(count==2019){
              System.out.println(i);
            }
          }
        }
        scan.close();
    }
}

 求出一定范围内的质数,当count值等于2019时,输出对应的质数。

第五题

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();
        int a=0;
        int b=0;
        int sum=n;
        while(n>=3){

          a=n/3;
          b=n%3;
          sum+=a;
          n=a+b;
          
        }
        System.out.println(sum);
        scan.close();
    }
}

 用a记录每次所拥有瓶盖可兑换饮料数量,b记录每次兑换时,剩余的小于3的瓶盖数,准备下一次兑换,a+b就是下一次要用来兑换的瓶盖,把它赋值给n,n表示每次拿多少个瓶盖去兑换。当n小于3时,兑换结束。用sum记录所喝饮料。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值