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

【力扣】2376. 统计特殊整数

如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。
给你一个 正 整数 n ,请你返回区间 [1, n] 之间特殊整数的数目。
示例 1:
输入:n = 20
输出:19
解释:1 到 20 之间所有整数除了 11 以外都是特殊整数。所以总共有 19 个特殊整数。

示例 2:
输入:n = 5
输出:5
解释:1 到 5 所有整数都是特殊整数。

示例 3:
输入:n = 135
输出:110
解释:从 1 到 135 总共有 110 个整数是特殊整数。
不特殊的部分数字为:22 ,114 和 131 。

public class SpecialNumberCounter {  public static int countSpecialNumbers(int n) {  if (n < 1) return 0;  int count = 0;  int length = (int) Math.log10(n) + 1; // 获取 n 的位数  // 从 1 到 length-1 位数的情况  for (int i = 1; i < length; i++) {  count += countSpecialNumbersWithFixedLength(i, 9); // 每一位的数字可以是 1-9 中的任意一个  }  // 处理长度为 length 的数  int[] usedDigits = new int[10]; // 用于标记哪些数字已被使用  for (int i = 1; i <= n; i *= 10) {  int currentDigit = n / i % 10; // 获取当前位的数字  if (currentDigit == 0) {  // 如果当前位是 0,则不能包含 0 作为特殊整数的最高位  // 但我们已经在前面的循环中处理了所有不包含 0 作为最高位的情况  // 所以这里直接跳过,不需要做任何处理  continue;  }  // 从当前位开始,生成所有可能的特殊整数  count += generateSpecialNumbers(n, i, currentDigit, usedDigits);  // 如果当前位小于 n 的对应位,那么可以包含从 0 到 currentDigit-1 的所有数字作为下一位的开头  // 但因为我们要的是互不相同的数位,所以实际上不能包含已经使用过的数字  // 但由于我们是从高位到低位遍历,所以这里不需要显式处理  // 标记当前位已经使用  usedDigits[currentDigit] = 1;  // 如果某一位是 0 并且不是最高位,那么后面的位可以自由选择(因为我们已经处理过最高位不为 0 的情况)  // 但由于我们是按位遍历的,所以这种情况会在下一轮循环中自动处理  }  return count;  }  // 生成长度为 length,且以 firstDigit 开头的特殊整数数量(不超过 max)  private static int generateSpecialNumbers(int max, int base, int firstDigit, int[] usedDigits) {  if (max < base) return 0; // 如果 max 已经小于当前位的 base,则无法生成更多的特殊整数  int count = 0;  usedDigits[firstDigit] = 1; // 标记 firstDigit 已被使用  // 从 firstDigit+1 开始,选择剩余的数位  for (int i = firstDigit + 1; i < 10; i++) {  if (usedDigits[i] == 0) { // 如果 i 没有被使用过  int remaining = max % base / (base / 10); // 剩余需要匹配的数位(不包括当前位)  if (remaining >= i) { // 如果剩余数位可以包含 i  count += generateSpecialNumbers(max, base / 10, i, usedDigits) + 1; // +1 表示当前这个数本身  }  }  }  usedDigits[firstDigit] = 0; // 恢复 usedDigits 数组  // 加上不以任何数字开头的特殊整数(即只有 firstDigit 的情况)  if (max >= base * firstDigit) {  count++;  }  return count;  }  // 计算固定长度的特殊整数数量(不包含前导零)  private static int countSpecialNumbersWithFixedLength(int length, int maxDigit) {  int count = 9; // 第一位不能为 0,所以有 9 种选择  for (int i = 1; i < length; i++) {  count *= maxDigit - i; // 后续每一位都有 maxDigit - i 种选择(因为已经选择了 i 个数字)  }  return count;  }  public static void main(String[] args) {  int n = 20;  System.out.println(countSpecialNumbers(n)); // 输出: 11  n = 1000;  System.out.println(countSpecialNumbers(n)); // 输出一个更大的范围内的特殊整数数量  }  
}

注意:上面的代码可能并不是最优解,并且包含了一些简化和假设(比如没有显式处理最高位为 0 的情况,因为题目通常意味着特殊整数是正整数,且没有前导零)。此外,generateSpecialNumbers 方法可能不是最高效的实现,因为它在递归过程中重复计算了一些情况。一个更优化的实现可能会使用动态规划或记忆化搜索来避免重复计算。

然而,这个实现应该能够给出正确的答案,并且对于不是特别大的 n 来说,性能是可以接受的。对于非常大的 n,我们可能需要进一步优化算法或使用更高效的数据结构。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • GO GIN SSE DEMO
  • 【Flink实战】flink消费http数据并将数组展开多行
  • AI健身之俯卧撑计数和姿态矫正-角度估计
  • 【JavaEE初阶】多线程7(面试要点)
  • 亚马逊IP关联揭秘:发生ip关联如何处理
  • [Python学习日记-27] 文件操作练习题解析
  • python新手的五个练习题
  • 计算机毕业设计 基于SpringBoot的小区运动中心预约管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • SpringBoot+Vue技术框架开发的ADR智能监测系统源码,Java语言的药品不良反应智能监测系统源代码
  • Vue工程师面试题
  • Homebrew安装与切换下载源
  • vue3中把封装svg图标为全局组件
  • 解决SVN蓝色问号的问题
  • Android开发高频面试题之——kotlin篇
  • 网络层协议 —— IP协议
  • 【EOS】Cleos基础
  •  D - 粉碎叛乱F - 其他起义
  • ERLANG 网工修炼笔记 ---- UDP
  • Java程序员幽默爆笑锦集
  • jquery ajax学习笔记
  • js
  • nodejs调试方法
  • windows下mongoDB的环境配置
  • 半理解系列--Promise的进化史
  • 高性能JavaScript阅读简记(三)
  • 汉诺塔算法
  • 缓存与缓冲
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 巧用 TypeScript (一)
  • 使用Gradle第一次构建Java程序
  • 微信开源mars源码分析1—上层samples分析
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • ​Spring Boot 分片上传文件
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #07【面试问题整理】嵌入式软件工程师
  • $.ajax()参数及用法
  • $.proxy和$.extend
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转载)Linux网络编程入门
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .Net6 Api Swagger配置
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET面试题(二)
  • @ModelAttribute 注解
  • @PostConstruct 注解的方法用于资源的初始化
  • [1] 平面(Plane)图形的生成算法
  • [BZOJ 1040] 骑士
  • [bzoj1912]异象石(set)