蓝桥杯冲刺31天day4

1、9数算式

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

观察如下的算式:

9213×85674=789314562

左边的乘数和被乘数正好用到了 1 ~ 9的所有数字,每个1次。 而乘积恰好也是用到了 1 ~ 9 的所有数字,并且每个 1 次。

请你借助计算机的强大计算能力,找出满足如上要求的 9 数算式一共有多少个?

注意:

  1. 总数目包含题目给出的那个示例。
  2. 乘数和被乘数交换后作为同一方案来看待。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

核心思路:

使用深度优先搜索dfs将1-9的数字进行全排列,然后将所生成的所有组合存进数组nums,结合循环利用substring函数将每种组合可能出现的被乘数与乘数算出被进行相乘,得到的乘积通过判断是否重复,是否包含0,是否不是九位数,如果满足所有条件,即乘积是九位数同时不包含0同时里边由1-9组成,则返回true,让计数器count加一,最后输出时要注意,因为被乘数和乘数会出现重复情况,所以要/2。

注:代码没错,会超时,不过此题是填空题,能做出结果即可,答案1625。

import java.util.*;
public class Main7 {
        public static int n = 9;
        public static int q = 0;
        public static int N = 400000;
        public static int []path = new int[N];
        public static String[]nums = new String[N];
        public static int count = 0;
        public static boolean[]st = new boolean[N];
        public static int p = 0;
        public static int rr = 0;
    public static void main(String[] args) {
       dfs(1);//从1开始排列
       for(int i = 0;i<q;i++){
        for(int j=0;j<8;j++){//补充:在这里我原本写的j<9,导致Integer.parseInt报错,因为里边不能包含""这种特殊字符
             String str1 = nums[i].substring(0,j+1);
             String str2 = nums[i].substring(j+1,9);
             //product=Integer.valueOf(str1)*Integer.valueOf(str2);
             int product1 = Integer.parseInt(str1);
             int product2 = Integer.parseInt(str2);//
             
             //StringBuilder  product=new StringBuilder(String.valueOf(Integer.parseInt(str1)*Integer.parseInt(str2)));
             
           if(isUnique(product1,product2)){
           count++;
             }
         }
       }
       System.out.println(count/2);//由于被乘数和乘数会重复,所以/2
   }
    public static void dfs(int u){
      if(u==n+1){//保证每个数字都能进入,因为开始dfs(1)
    	  //nums[q]=String.valueOf(path[1]);
    	  nums[q]="";
       for(int i = 1;i<=n;i++){
    	   
    	   nums[q]+=String.valueOf(path[i]);
       }
       q++;
       return;
      }
      for(int i = 1;i<=n;i++){//每次进这个for循环后,只有没被标记的才能往下走
        if(!st[i]){//st数组是标记功能,没标记的进入
        path[u]=i;//遵循深度优先探索进行赋值
        st[i] = true;//标记为用过的
        dfs(u+1);//进行下一个数字
        st[i]=false;//进行回溯,恢复现场,由于path会被接下来的每一种排列所覆盖,所以不需要进行回溯
        }
        }

    }
    public static boolean isUnique(int n1,int n2) {//判断是否有重复的,是否包含0,是否不是九位数
    	int res = n1*n2;
    	String s = String.valueOf(res);
    	if(s.contains("0")||s.length()!=9) {
    		return false;
    	}
    	Set<Character>set = new HashSet<>();//利用set集合来进行去重
    	for(char c:s.toCharArray()) {
    		set.add(c);
    	}
    	return(set.size()==s.length());//判断是否重复
    	
    }
}

3、山

这天小明正在学数数。

他突然发现有些止整数的形状像一挫 “山”, 比如 123565321、145541, 它 们左右对称 (回文) 且数位上的数字先单调不减, 后单调不增。

小朋数了衣久也没有数完, 他惒让你告诉他在区间 [2022,2022222022]中有 多少个数的形状像一座 “山”。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

思路: 

依然是填空题,答案3138,利用 StringBuilder的翻转reverse即可判断回文数,又因为是回文数,只需要判断一半是不是单调不减即可。

import java.util.*;
public class Main{
 public static void main(String[] args) {
  long ans=0;
  for(long i=2022;i<=2022222022;i++) {
   if(ismt(i)) {
    ans++;
   }
  }
  System.out.println(ans);
 }
 
 private static boolean ismt(long i) {
  //判断是否回文
  String string = String.valueOf(i);
  StringBuilder s = new StringBuilder(string);
  if(string.compareTo(s.reverse().toString())==0) {  //使用StringBuilder的reverse,进行翻转判断回文数
   for(int j=0;j<string.length()/2;j++) {
    int l = Integer.valueOf(string.charAt(j));
    int r = Integer.valueOf(string.charAt(j+1));
    if(r<l)//只需要判断前半边就行了,因为是回文数
     return false;
   }
   return true;
  }
  return false;
 }
 
}
 

剩下两题尽快补上,先认真做俩题打卡啦,作业太多,不好意思。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值