旋转数字详解
Posted Roam-G
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数字详解相关的知识,希望对你有一定的参考价值。
旋转数字
难度中等143
我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。
如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方(在这种情况下,它们以不同的方向旋转,换句话说,2 和 5 互为镜像);6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。
现在我们有一个正整数 N
, 计算从 1
到 N
中有多少个数 X 是好数?
示例:
输入: 10 输出: 4 解释: 在[1, 10]中有四个好数:
2, 5, 6, 9。
注意 1 和 10 不是好数, 因为他们在旋转之后不变。
解题:
镜像 A :2,5,6,9 无法旋转的B:3·4·7 自己 :0,1,8,
X 1~10,只需包含 A
X >10,
1.不包含B
2.包含 A
1- 把两位以上的数,分割位list
char[] charArray = String.valueOf(num).toCharArray();
2-判断两个list是否有交集
List<Long> ids = array.toJavaList(Long.class); List<Long> optIds = dscRegionService.getOtherOptIds(null);
boolean flag = Collections.disjoint(ids , optIds);
if(!flag) // 两个list有交集 说明重复
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MirrorNumber
public static void main(String[] args)
// System.out.println(GoodNumber(857));
System.out.println(GoodNumber_Official(857));
// 判断1-N之间有多少个 好数。
public static int GoodNumber(int n)
List<Integer> list = new ArrayList<Integer>();
List<Integer> listA = new ArrayList<Integer>();
List<Integer> list_temp = new ArrayList<Integer>();
// 镜像数字
listA.add(2);
listA.add(5);
listA.add(6);
listA.add(9);
List<Integer> listB = new ArrayList<Integer>();
// 特殊数字
listB.add(3);
listB.add(4);
listB.add(7);
// 把符合的数字塞入list
for (int i = 1; i <= n; i++)
// 1. 个位数 --必须是A之内部的数字
if (i <= 10)
if (listA.contains(i))
// IS GoodNumber
list.add(i);
else
// 2. 两位数以上 --必须是 包含A,但是不包含B (至少有一个A即可),
int a = 0;
// 数字分割为list
char[] number_char = String.valueOf(i).toCharArray();
// 分割后的数字放入list
for (int i1 = 0; i1 < number_char.length; i1++)
// char ->Integer
a = Integer.parseInt(String.valueOf(number_char[i1]));
list_temp.add(a);
// 判断list_temp 是否和listA、listB有交集。
boolean flag1 = Collections.disjoint(listA, list_temp);
boolean flag2 = Collections.disjoint(listB, list_temp);
// 包含listA 不包含listB
if (flag1 == false && flag2 == true)
System.out.println(i + ",-------------是GoodNumber");
list.add(i);
// 置空
list_temp.clear();
System.out.println("判断完毕!输出 GoodNumber:");
for (int b : list)
System.out.println("GoodNumber---" + b);
return list.size();
// 官方题解
// check = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
static int[] check = 0, 0, 1, -1, -1, 1, 1, -1, 0, 1;
//定义一个数组,A组:2,5,6,9 统一用1表示【必须包含】,B组: 3,4,7用-1表示【不可以包含】 0,1,8用0表示。【无用】,
public static int GoodNumber_Official(int n)
int ans = 0;
for (int i = 0; i < n; i++)
String num = String.valueOf(i);
// int数字,转为String
boolean flagA = false, flagB = false;
// 初始化都不包含
for (int i1 = 0; i1 < num.length(); i1++)
char ch = num.charAt(i1);
// 获取数字中的每一位
if (check[ch - '0'] == -1)
// 如果包含了B
flagB = true;
else if (check[ch - '0'] == 1)
// 如果包含了A
flagA = true;
// 只有包含A 不包含B 符合条件
if (flagA == true && flagB == false)
System.out.println("---------" + i);
++ans;
return ans;
以上是关于旋转数字详解的主要内容,如果未能解决你的问题,请参考以下文章