当前位置: 首页 > news >正文

最大数字(java)(DFS实现)

1.最大数字 - 蓝桥云课

因为N最大是·10 的17次方,

所以可以利用字符串来处理输入的数字的每一位

并且是从高到低依次处理的

然后通过函数charAt(i)来获取第i位的字符

再减去‘0’就可以将字符转化为整型了

假设每一位数字都是x

然后通过两种操作

加或者减来操作

然后每次操作的话我们先判断加

如果这个数字的第i位还存在的话

那就可以进行加或者减

然后我们开始dfs之前先

判断加多少位,能把第一位变成9 

我们尽最大的努力去把每一位都加到9

两种情况

第一种 如果加法 的次数最多不超过9-x 吧 

因为加的次数多了又加到0了

做无用功了,你说对吧

第二种情况 如果加法 的次数不足以把x加到9 

我们

加的次数就是9-x 和n 中的最小值

(9-x)也就是x加到9的次数

t 取 (9-x)和 n 的最小值

回溯之前 : 剩余的 加的次数 就是n =n -t; 

然后就开始dfs()嵌套循环了

开始的时候是

dfs(i,v) i表示当前这个数的位数的下标

v 用来保存操作之后的值

dfs(i+1,v*10+t) 表示进入下一位,便利下一个节点i+1

然后需要保存这一次加法之后的值

然后如果回溯回回来就需要把给加法次数加回来

ok自己写一遍

emm,又出问题了,孩子们



import java.util.Scanner;

/**
 * @author zb
 * date2025/3/26 21:32
 */
public class Main {
    static int n ;
    static int add;
  static   int jian;

  static String num;
  static int max = 0;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
         n = in.nextInt();
         num = ""+n;
        add = in.nextInt();
       jian  = in.nextInt();
//       先从最高为开始操作
        dfs(0,0);

        System.out.println(max);

        in.close();
    }
//代表给第i位操作 ,v 用来保存操作的结果
    private static void dfs(int i, int v) {

        if(i<num.length()){
//            加法操作
//            获取第i位的数字
            int numi = num.charAt(i)-'0';
//            加到9所需要的次数
            int t = 9  - numi;
//            如果加的次数不能让这个数字加到9
          if(add<=t){
//              能加多少算多少
              t = add;
          }
//          减去消耗掉的加法次数
          add = add - t;
//            System.out.println(t+"   "+add);
//          便利叶子节点
          dfs(i+1,v*10 +numi+t);
//     从叶子节点变回来了     回复现场
            add = add+ t;
//            减法 的话一定要把这个数字给变成0
//           也就是减法必须要被这个位置的数字大
//            某一位最大只能变成9
            if(numi-jian<0&&numi!=9){
//                numi  = 9;
//               等于-1也就是变成9
                jian = jian - numi-1;
//                System.out.println("   "+jian);
                dfs(i+1,v*10 +9);
                jian  = jian + numi + 1;
            }



        }else {
//            保存进行操作之后得到的最大值
            max = Math.max(max,v);

        }
    }
}

整体思路没有问题,死于段错误

看了一下题目发现

最大的n已经完全超出了int 的范围了,当时写的时候没有注意输入的N 的范围

查了一下java中的long 范围是 从-2 的63次方到2 的63 次方-1,也就是范围到2 * 10 的18次方-1

用long 来接受输入n,就行了,emm,下次一定要睁大眼睛看输入的范围

接收输入得用nextLong ()

输出的sum也得用long 类型输出

然后dfs的第二个保存修改之后的数字的参数也得用long 

emm

相关文章:

  • AMD机密计算虚拟机介绍
  • ubuntu系统安装docker
  • 天梯赛 L2-022 重排链表
  • 自顶向下学习K8S--部署Agones
  • Lua 数组
  • 平安证券 NoETL 指标平台实践:统一数据口径,驱动高效经营分析与智能决策
  • Ubuntu 使用终端手动连接无线网络(wlan0)完整流程 + 故障排查记录
  • Vue3.5 企业级管理系统实战(十一):全屏切换组件
  • 产生式系统的完整示例——医疗诊断系统(附python代码)
  • zookeeper部署教程
  • 如何自动化同义词并使用我们的 Synonyms API 进行上传
  • java项目之基于ssm的亚盛汽车配件销售业绩管理系统(源码+文档)
  • 【每日算法】Day 11-1:分治算法精讲——从归并排序到最近点对问题(C++实现)
  • [运维]Linux系统扩容磁盘空间-将未分配的空间进行整合分配
  • 规范Unity工程目录和脚本结构能有效提升开发效率、降低维护成本
  • FastBlock是一个专为全闪存场景设计的高性能分布式块存储系统
  • Pytroch搭建全连接神经网络识别MNIST手写数字数据集
  • 在MFC中使用Qt(四):使用属性表(Property Sheet)实现自动化Qt编译流程
  • idea设置全局maven配置 对新建项目生效
  • 前端 - ts - - declare声明类型
  • 词条数量大幅扩充,《辞海》第八版启动编纂
  • 浙江演艺集团7部作品组团来沪,今夏开启首届上海演出季
  • 总奖金池百万!澎湃与七猫非虚构写作与现实题材征文大赛征稿启动
  • 董军同德国国防部长举行会谈
  • 马上评|让查重回归促进学术规范的本意
  • 阿尔巴尼亚执政党连续第四次赢得议会选举,反对党此前雇用特朗普竞选经理