题目一:特殊数组的特征值
思路:首先对数组进行升序排列,然后遍历数组,如果是第一个数,则如果该数大于等于数组长度,则满足条件,令result=n,又由于只有一个特征值,所有直接退出循环,返回结果;如果不是第一个数,则如果有第i个元素大于n-i,则表示至少有n-i个元素大于等于n-i,所有还需要判断前一个元素是否也大于等于n-i,如果是则不满足条件,否则满足条件,令result=n-i,然后跳出循环。
代码:
public static int specialArray(int[] nums) {
int result=-1;
//对数组进行升序排序
Arrays.sort(nums);
int n=nums.length;
for(int i=0;i<n;i++) {
if(i!=0) {
if(nums[i]>=n-i&&nums[i-1]<n-i) {
result=n-i;
break;
}
}else {
if(nums[i]>=n-i) {
result=n-i;
break;
}
}
}
return result;
}
运行成功截图:
题目二:门牌制作
思路:首先定义一个方法,用于计算某数中有含有多少个字符2,最后计算从1~2020中每个数中含有的字符2,然后将其相加即为结果,最后返回个数。
代码:
public class Main {
//1~2020总共有多少个字符2
public static void main(String[] args) {
int count=0;
for(int i=2;i<=2020;i++) {
count+=isAdapte(i);
}
System.out.println(count);
}
public static int isAdapte(int i) {
int num=0;
String s=i+"";
for(int j=0;j<s.length();j++) {
if(s.charAt(j)=='2') {
num++;
}
}
return num;
}
}
运行成功截图:
题目三:货物摆放
思路:三个数相乘等于该数,则这三个数都是该数的约数,所以定义一个集合用于存储该数的所有约数,然后利用三重循环遍历该集合,判断三个约数相乘是否等于该数,如果是,则count++,最后返回所有方案数目count。
代码:
public class Main {
//2021041820210418
public static void main(String[] args) {
long n=2021041820210418l;
int count=0;
ArrayList<Long> result=new ArrayList<Long>();
for(long i=1;i<=Math.sqrt(n);i++) {
if(n%i==0) {
if(!result.contains(i)) {
result.add(i);
}
if(!result.contains(n/i)) {
result.add(n/i);
}
}
}
for(int i=0;i<result.size();i++) {
for(int j=0;j<result.size();j++) {
for(int k=0;k<result.size();k++) {
if(result.get(i)*result.get(j)*result.get(k)==n) {
count++;
}
}
}
}
System.out.println(count);
}
}
运行成功截图: