目录
1.前言
数位操作,就是说给你一个数n,要求你把当中的每一个位数取出来,然后再根据题目的具体情况添加额外的条件,常见的操作类型有:数位反转、去除前导0后导0、每个数字出现的次数等等。
在很多题目中,比如在数位dp、高精度、一些子集问题中常常涉及到数位操作,因此,掌握几种常见的数位操作是很必要的选择,该文章将介绍本人常见的几种数位操作。
2.如何分解?
将一个数的每一位取出有很多种思路,下面介绍几种常见思路
2.1 字符串
无脑操作,String转char[],不解释
public static void method1(int n){
char []arr =String.valueOf(n).toCharArray();
}
2.2 数学运算
每一次通过先对10取余,获得尾部的数,然后再除以10,进行下一位判断,如此循环
//将数位保存在数组中
public static int[] method2(int n){
int []arr =new int[getWeishu(n)];
int len =0;
while(n !=0){
arr[len++] = n % 10;
n /= 10;
}
return arr;
}
//得到位数
public static int getWeishu(int n){
int num=0;
while(n != 0){
n /=10;
num++;
}
return num;
}
2.3 简短操作
用于反转时的操作,建议举一个例子在草稿纸上徒手debug一下
void method3(int n)
{
cin>>n;
while(n) s=s*10+n%10,n/=10;
cout<<s;
}
2.4 栈
public static Stack<Integer> method3(int n){
Stack<Integer> stack =new Stack<>();
while(n!=0){
stack.add(n%10);
n /=10;
}
return stack;
}
2.5 获取num中特定一位数字
//获取num中第n位数字
public static int getNum(int num,int n){
//获取num总位数
int weiShu=0,mid=num;
while(mid >0){
mid/=10;
weiShu++;
}
num = (int) (num/ Math.pow(10,(weiShu-n))) %10;
return num;
}
3.常见题型
整理一下可能会经常出现的数位操作的题型:
3.1 数位dp
数位dp是一种计数用的dp,一般是要统计一个区间[le,ri]内满足一些条件数的个数。所谓数位dp,字面的意思就是在数位上进行动态规划。
比如这种题:
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089
这种就是经典的数位dp类型的题目,需要取出每一位进行判断,在本文中不详细介绍数位dp的解题思路,只选择其中的数位操作进行解析。
我们首先需要一个数组,把每一位数都放进去,因此就有这样一个函数
//传入一个,返回一个数位数组
public static int [] method(int n){
int []arr =new int[getWeishu(n)];
int len=0;
while(n!=0){
arr[len++] = n % 10;
n /= 10;
}
return arr;
}
//得到位数
public static int getWeishu(int n){
int num=0;
while(n != 0){
n /=10;
num++;
}
return num;
}
输出结果:
3.2 数位操作+桶排序思路
根据桶排序的思想将题目的限定条件分为n类,如下题:
链接:https://ac.nowcoder.com/acm/problem/16422
本题需要根据需求码的位数来判断对应的书码是否相等。在处理数位的思路上也是相似的,从字符串操作和运算操作两种思路出发。
3.3 数位反转
这个就更简单了,每一位提取出来反转过来就好了,不过需要这道题用字符串的方式做需要判断前导0
链接:https://www.luogu.com.cn/problem/P1307
public class Main {
public static void main(String[] args) {
Scanner s =new Scanner(System.in);
while(s.hasNext()){
int n =s.nextInt();
int a=0;
while(n!=0){
a = a*10 + n%10;
n /=10;
}
System.out.println(a);
}
}
}
4. 总结
总的来说,这一类问题根据字符串和运算操作两种思路就可以进行数位操作,再根据题意加上附加条件进行解答。