备战蓝桥14弹

第一题

class Solution {
    public int specialArray(int[] nums) {
        //int flag=-1;
        for(int i=0;i<=nums.length;i++){
            int j=0;
            int count=0;
            while(j<nums.length){
                if(i<=nums[j]){
                    count++;
                }
                j++;
            }
            if(count==i){
                return i;
            }
        }
return -1;
    }
}

思路:还是暴力算法,首先特征值肯定是小于等于数组长度的,令i初始值为0,一遍遍的遍历数组,找到其中符合要求的元素个数count,如果count==i,返回i,否则继续执行。如果最后也没得到i的话,那就返回-1。 

第二题

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=0;
         for(int i=1;i<=2020;i++){
          int j=i;
          int m=0;
          while(j>0){
            m=j%10;
            j=j/10;
            if(m==2){
              count++;
            }
          }
         }
        System.out.println(count);
      
        scan.close();
    }
}

 思路:暴力算法,遍历1到2020,对每个数的每个数字进行分析,如果是2,count加一,最后返回count。

第三题

import java.util.Scanner;
import java.util.ArrayList;


// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
      long num=2021041820210418l;
      int count =0;
      ArrayList<Long> arr=new ArrayList<>();
      for(long i=1;i<=Math.sqrt(num);i++){
        if(num%i==0){
          arr.add(i);

          long n=num/i;

          if(n!=i){
            arr.add(n);
          }
        }
      }
      for(long a:arr){
        for(long b:arr){
          for(long c:arr){
            if(a*b*c==num){
              count++;
            }
          }
        }
      }
      System.out.println(count);
        scan.close();
    }
}

 思路:

如果使用暴力算法的话,运行时间太长。所以可以考虑先将num的因子都找出来。在找因子时,直接遍历num还是不行,但是可以先找到小于num的开平方数的因子,再用num/i,就可以得到大于num开平方数的一个因子(以num的开平方数为界,左边的每一个因子都与右边的因子一一对应)。将不重复的因子添加到arr集合里,最后遍历三次该集合,得到三个因子相乘等于num,并统计这种组合的数量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值