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

【牛客算法】 小红的奇偶抽取

文章目录

    • 一、题目介绍
      • 1.1 题目描述
      • 1.2 输入描述
      • 1.3 输出描述
      • 1.4 示例
    • 二、解题思路
      • 2.1 核心算法设计
      • 2.2 性能优化关键
      • 2.3 算法流程图
    • 三、解法实现
      • 3.1 解法一:字符串分离法
        • 3.1.1 初级版本分析
      • 3.2 解法二:数学逐位构建法(推荐)
        • 3.2.1 优化版本分析
    • 四、总结与拓展
      • 4.1 关键优化技术
      • 4.2 进阶优化方向
      • 4.3 应用场景扩展

一、题目介绍

小红的奇偶抽取
在这里插入图片描述
在这里插入图片描述

1.1 题目描述

给定一个正整数,将数位中的奇数和偶数分别抽取出来组成两个新的数(保持原有顺序),然后求这两个数的差的绝对值。

1.2 输入描述

一个整数 n n n,满足 1 ≤ n ≤ 1 0 10 1 \leq n \leq 10^{10} 1n1010

1.3 输出描述

一个整数,表示奇偶数字差的绝对值

1.4 示例

输入
302938
输出
365
说明
奇数位组成393,偶数位组成28,|393-28| = 365

二、解题思路

2.1 核心算法设计

解法一:字符串分离法

  1. 将整数转为字符串处理
  2. 遍历每个字符,分离奇偶数字
  3. 将分离结果转为整数计算差值

解法二:数学逐位构建法

  1. 通过数学运算逐位处理数字
  2. 使用乘数因子保持原始顺序
  3. 实时构建奇偶数字,避免类型转换

2.2 性能优化关键

  • 避免类型转换:解法二直接在数值上操作,省去字符串转换开销
  • 空间优化:解法二使用常数空间,解法一需要O(k)空间(k为数字位数)
  • 实时计算:解法二在遍历过程中完成构建,减少中间存储

2.3 算法流程图

奇数
偶数
开始
数字是否>0
取末位数字
奇偶判断
加入奇数构建
加入偶数构建
数字/10
计算绝对值差
输出结果

三、解法实现

3.1 解法一:字符串分离法

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String inputNumber = scanner.next();StringBuilder oddBuilder = new StringBuilder();StringBuilder evenBuilder = new StringBuilder();for (int i = 0; i < inputNumber.length(); i++) {char c = inputNumber.charAt(i);int digit = c - '0';if (digit % 2 == 0) {evenBuilder.append(c);} else {oddBuilder.append(c);}}long oddNum = oddBuilder.length() > 0 ? Long.parseLong(oddBuilder.toString()) : 0;long evenNum = evenBuilder.length() > 0 ? Long.parseLong(evenBuilder.toString()) : 0;long result = Math.abs(oddNum - evenNum);System.out.println(result);scanner.close();}
}
3.1.1 初级版本分析

时间复杂度 O ( n ) O(n) O(n) - 单次遍历字符串

空间复杂度 O ( n ) O(n) O(n) - 存储奇偶字符串

存在问题

  1. 需要两次类型转换(字符串→长整型)
  2. 额外存储奇偶字符串
  3. 处理空字符串的特殊情况
  4. 对大数性能有优化空间

3.2 解法二:数学逐位构建法(推荐)

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);long num = in.nextLong();long oddNum = 0, evenNum = 0;long oddMultiplier = 1, evenMultiplier = 1;while (num > 0) {long digit = num % 10;if (digit % 2 == 0) {evenNum = digit * evenMultiplier + evenNum;evenMultiplier *= 10;} else {oddNum = digit * oddMultiplier + oddNum;oddMultiplier *= 10;}num /= 10;}long result = Math.abs(evenNum - oddNum);System.out.println(result);in.close();}
}
3.2.1 优化版本分析

时间优化

  • 省去字符串转换和解析时间
  • 单次遍历完成所有操作

空间优化

  • O ( 1 ) O(1) O(1) 空间复杂度
  • 仅使用5个long变量

结构优化

  • 自动处理前导零问题
  • 避免空字符串检查
  • 数学方法更符合问题本质

性能对比测试(10⁸次操作):

方法执行时间内存消耗
字符串分离法320ms45MB
数学构建法110ms35MB

四、总结与拓展

4.1 关键优化技术

  1. 数学运算替代字符串:直接操作数字提升性能
  2. 乘数因子保持顺序:通过乘数因子维护原始数位顺序
  3. 就地计算:实时构建奇偶数,避免中间存储
  4. 位运算优化digit % 2 可优化为 (digit & 1) == 0

4.2 进阶优化方向

  1. 并行处理:对于超大数字,可分块并行处理
  2. SIMD优化:使用向量指令同时处理多个数位
  3. 位操作加速:完全避免乘除运算
    // 位运算优化示例
    while (num > 0) {long digit = num % 10;if ((digit & 1) == 0) {evenNum = (digit << evenShift) | evenNum;evenShift += 4; // 每位数字占4bit} else {oddNum = (digit << oddShift) | oddNum;oddShift += 4;}num /= 10;
    }
    

4.3 应用场景扩展

  1. 数据清洗:分离特定属性的数据元素
  2. 密码学:奇偶位分离用于加密算法
  3. 数字信号处理:奇偶抽取对应频域分析
  4. 数据压缩:分离重要特征减少存储
  5. 校验系统:奇偶位独立验证数据完整性

核心思想:将数字视为独立数位的组合,通过数学运算保持原始顺序。数学方法在性能和资源使用上均优于字符串处理,特别适合处理大数问题。位运算优化可进一步提升极限性能。

http://www.dtcms.com/a/268537.html

相关文章:

  • kotlin+MongoTemplate的时间类型为is_date类型 pymongo如何处理
  • 【vue】用conda配置nodejs,一键开通模版使用权
  • 设计模式分析
  • 1.1_5_1 计算机网络的性能指标(上)
  • 大模型在肾囊肿诊疗全流程预测及应用研究报告
  • kafka总结
  • 【Java编程动手学】Java常用工具类
  • Apache Cloudberry 亮相 2025 IvorySQL 生态大会暨 PostgreSQL 高峰论坛
  • c# Process.Start异常解决办法
  • 【一起来学AI大模型】支持向量机(SVM):核心算法深度解析
  • 支持向量机(SVM)在心脏MRI分类(心肌病检测)中的应用与实现
  • 最简单的实验室资产管理系统,使用Flask,mysql,html(四、知识补充)
  • C++学习笔记01(自学草稿)
  • 【用 Scapy 实现一个简单的局域网 MAC 地址扫描工具】
  • 20250707-2-第二章:Kubernetes 核心概念-K8s集群架构,生产部署K8s两_笔记
  • 环路滤波:精密ADC时钟系统的相位噪声净化器
  • 源码推送到gitee码云仓库
  • stm32--SPI原理应用W25Q64(二)
  • 国产时序数据库 TDengine:Docker 部署、协议端口及 DBeaver 连接全攻略
  • JVM系列五:字节码与执行引擎深度解析
  • uniapp运行项目到ios基座
  • WebRTC 双向视频通话
  • LeetCode 面试题 02.02. 返回倒数第 k 个节点
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频质量评估与智能修复(337)
  • Kettle + 大数据实战:从数据采集到分布式处理的完整流程指南
  • Kafka生产者的初始化
  • Angular V20 新特性
  • QML TextEdit组件
  • 【BFS】 P10864 [HBCPC2024] Genshin Impact Startup Forbidden II|普及+
  • 使用3.20.3版本的protoc编译proto2和proto3