zoukankan      html  css  js  c++  java
  • java:数据结构(二)栈的应用(进制转换全收集)

    说到进制转换,java已经封装了基本的方法,在竞赛中使用封装的方法自然能节省大量时间

    另一位仁兄介绍的封装好的方法:

    https://blog.csdn.net/m0_37961948/article/details/80438113

    如果不想看上面的全部,我总结了两条基本方放,记下就可以随意转化:

    掌握这两个方法就可以实现任意进制的随便转化

     (这个是针对竞赛,如果是需要学习底层,大家还在看api研究吧)

    再看一个水题:

    题目描述

    写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )

    输入描述:

    输入一个十六进制的数值字符串。

    输出描述:

    输出该数值的十进制字符串。

    示例1

    输入

    0xA

    输出

    10

     由于本题目简单,所以只给出代码:

     1 import java.util.Scanner;
     2 import java.util.*;
     3 
     4     public class Main{
     5         public static void main(String args[]){
     6             Scanner in = new Scanner(System.in);
     7         while (in.hasNext()) {
     8             String a=in.next();
     9             char[] p=a.toCharArray();
    10             a=String.valueOf(Arrays.copyOfRange(p,2,p.length));
    11             System.out.println(Integer.parseInt(a, 16));
    12             }
    13         }
    14     }

    后面就是靠栈实现任意进制不使用已经封装好的方法:(栈使用的是我自己写的)

     1    /**
     2      * 进制转换
     3      * 算法设计:先将其他进制统一转为10进制,再利用取余法
     4      * 将10进制转为其他进制
     5      * @param n  需要转化的数
     6      * @param n1 需要转化数的进制
     7      * @param n2 转化后的进制
     8      * @return 转换后的数
     9      */
    10     static String systemTransformation(String n, int n1, int n2) {
    11         MyArraysStack<Character> e=new MyArraysStack<Character>();
    12         char[] a=new char[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    13         char[] b=n.toCharArray();
    14         int bNumber=0,t=0;
    15         //[start]将n1进制转为10进制
    16         for (char p:b){
    17             e.push(p);
    18         }
    19         while (!e.isEmpty()){
    20             char temp=e.pop();
    21             bNumber+= Arrays.binarySearch(a,temp)*Math.pow(n1,t);
    22             t++;
    23         }
    24         //[end]
    25         //[start]  将10进制转为n2进制
    26         StringBuilder builder=new StringBuilder();
    27         while (bNumber>0){
    28             e.push(a[bNumber%n2]);
    29             bNumber/=n2;
    30         }
    31         while (!e.isEmpty()) {
    32             builder.append(e.pop());
    33         }
    34         //[end]
    35         String str;
    36         str=builder.toString();
    37         return str;
    38     }
    * 算法设计:先将其他进制统一转为10进制,再利用取余法
    * 将10进制转为其他进制
    * 最高到16进制向其他任意一进制转化
    * 如果需要更大的进制则需要扩充a数组即可
    当你觉得自己在进制转换上已经完全ok了,此时我又遇到了一道有趣的题目:

    题目描述

    
    
    输入两个整数,求两个整数二进制格式有多少个位不同

    输入描述:

    两个整数

    输出描述:

    二进制不同位的个数
    示例1

    输入

    22 33

    输出

    5
    一看到这道题我首先想到,先将两个数转为二进制,然后循环比对出值(突然感到十分麻烦)
    然后一看讨论发现了骚操作:
    使用异或:
     1 public class Solution {
     2     /**
     3      * 获得两个整形二进制表达位数不同的数量
     4      *
     5      * @param m 整数m
     6      * @param n 整数n
     7      * @return 整型
     8      */
     9     public int countBitDiff(int m, int n) {
    10         String str=Integer.toBinaryString(m^n);
    11         str=str.replaceAll("0","");
    12         return str.length();
    13     }
    14 }

      异或就是不同为1,相同为0,将m和n异或,是位运算,m^n的结果是m和n二进制的异或结果

      Integer.toBinaryString();将m^n转为二进制

      然后替换了字符串里面的0,返回字符串长度,即得到了不同的位数

     
  • 相关阅读:
    如何查看微信公众号的历史文章(微信订阅号查看历史消息)
    微信服务号有福啦 每月可以微信群发4次
    欲提高微信图文转化率 需学点如何吊胃口
    只需按一下空格键就可以标注 不用众里寻他千百度
    如何让你的微信图文转化率达到300%
    是智能手机推动windows xp系统停止服务吗
    响应式js幻灯片代码一枚
    微信公众平台回复链接可以直接访问,但不能是锚文字链接<a>标签
    如何用腾讯电脑管家备份微信聊天记录
    android版微信5.2.1更新 支持微信聊天记录备份到电脑上
  • 原文地址:https://www.cnblogs.com/lzy321/p/10388131.html
Copyright © 2011-2022 走看看