旋转数字详解

Posted Roam-G

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数字详解相关的知识,希望对你有一定的参考价值。

旋转数字

难度中等143

我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。

如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方(在这种情况下,它们以不同的方向旋转,换句话说,2 和 5 互为镜像);6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。

现在我们有一个正整数 N, 计算从 1N 中有多少个数 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;
    

以上是关于旋转数字详解的主要内容,如果未能解决你的问题,请参考以下文章

基数排序

C++旋转数组(三种解法详解)

算法知识详解基数排序算法

经典欧拉回路应用——旋转鼓轮模型

经典欧拉回路应用——旋转鼓轮模型

lintcode 170旋转链表