基于Java解決華為機試實現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換?
1.簡述
描述:
原理:ip地址的每段可以看成是一個0-255的整數(shù),把每段拆分成一個二進制形式組合起來,然后把這個二進制數(shù)轉(zhuǎn)變成
一個長整數(shù)。
舉例:一個ip地址為10.0.3.193
每段數(shù)字 相對應的二進制數(shù)
10 00001010
0 00000000
3 00000011
193 11000001
組合起來即為:00001010 00000000 00000011 11000001
,轉(zhuǎn)換為10進制數(shù)就是:167773121
,即該IP地址轉(zhuǎn)換后的數(shù)字就是它了。
本題含有多組輸入用例,每組用例需要你將一個ip地址轉(zhuǎn)換為整數(shù)、將一個整數(shù)轉(zhuǎn)換為ip地址。
數(shù)據(jù)范圍:保證輸入的是合法的 IP 序列
輸入描述:
輸入 :
- 1 輸入IP地址
- 2 輸入10進制型的IP地址
輸出描述:
輸出:
- 1 輸出轉(zhuǎn)換成10進制的IP地址
- 2 輸出轉(zhuǎn)換后的IP地址
示例1
輸入:
10.0.3.193 167969729
輸出:
167773121
10.3.3.193
2.代碼實現(xiàn)
方法一:通過二進制進行轉(zhuǎn)換
具體方法:
在問題中有兩個轉(zhuǎn)換過程,一個是將ip地址轉(zhuǎn)換為長整數(shù),一個是將長整數(shù)轉(zhuǎn)換為ip地址,通過題目中的轉(zhuǎn)換過程進行轉(zhuǎn)換。 對于ip地址轉(zhuǎn)換成長整數(shù): 1、將ip地址切割成四段數(shù)字 2、每段數(shù)字用8位2二進制數(shù)字表示 3、將四段二進制數(shù)字組合 4、將二進制數(shù)字轉(zhuǎn)換成長整數(shù) 對于長整數(shù)轉(zhuǎn)換成ip地址則步驟相反 1、將長整數(shù)轉(zhuǎn)換成32位二進制數(shù)字 2、將32位二進制數(shù)字進行切割 3、將每段的二進制數(shù)字轉(zhuǎn)換為十進制數(shù)字 4、形成ip地址
import java.util.Scanner; public class Main { ? ? public static void main(String[] args){ ? ? ? ? Scanner sc = new Scanner(System.in); ? ? ? ? while(sc.hasNext()){ ? ? ? ? ? ? String s = sc.next(); ? ? ? ? ? ? if(s.contains(".")){ ? ? ? ? ? ? ? ? System.out.println(ip2num(s)); ? ? ? ? ? ? }else{ ? ? ? ? ? ? ? ? System.out.println(num2ip(Long.parseLong(s))); ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? public static long ip2num(String ip){ ? ? ? ? String[] iip = ip.split("\\."); ? ? ? ? StringBuilder sb = new StringBuilder(); ? ? ? ? for(int i=0; i<4; i++){ ? ? ? ? ? ? int num = Integer.parseInt(iip[i]); ?// 拆分 ? ? ? ? ? ? String num2 = Integer.toBinaryString(num); ?//轉(zhuǎn)換為二進制 ? ? ? ? ? ? while(num2.length()<8){ ? ? ? ? ? ? ? ? num2 = "0" + num2; ?// 拼接 ? ? ? ? ? ? } ? ? ? ? ? ? sb.append(num2); ? ? ? ? } ? ? ? ? return Long.parseLong(sb.toString(), 2); ?// 轉(zhuǎn)化為10進制 ? ? } ? ? public static String num2ip(long num){ ? ? ? ? String num2 = Long.toBinaryString(num); ?//轉(zhuǎn)換為2進制 ? ? ? ? while(num2.length()<32){ ? ? ? ? ? ? num2 = "0" + num2; ? ? ? ? } ? ? ? ? String[] ans = new String[4]; ? ? ? ? for(int i=0; i<4; i++){ ? ? ? ? ? ? String s = num2.substring(8*i, 8*i+8); ?//拆分 ? ? ? ? ? ? s = Integer.toString(Integer.parseInt(s, 2)); ?//轉(zhuǎn)化為10進制 ? ? ? ? ? ? ans[i] = s; ? ? ? ? } ? ? ? ? return String.join(".", ans); ?//拼接 ? ? } }
方法二:直接轉(zhuǎn)換(10進制和256進制)
具體方法:
在第一種方法中,我們通過二進制進行轉(zhuǎn)換,但是仔細分析之后,我們發(fā)現(xiàn),二進制在轉(zhuǎn)換過程中并沒有起到作用,再進行重新分析,我們可以發(fā)現(xiàn),ip地址實際上是256進制下的四位數(shù)字,所以我們可以直接進行轉(zhuǎn)換,將10進制轉(zhuǎn)化為256進制。
import java.util.Scanner; public class Main { ? ? public static void main(String[] args){ ? ? ? ? Scanner sc = new Scanner(System.in); ? ? ? ? while(sc.hasNext()){ ? ? ? ? ? ? String s = sc.next(); ? ? ? ? ? ? if(s.contains(".")){ ? ? ? ? ? ? ? ? System.out.println(ip2num(s)); ? ? ? ? ? ? }else{ ? ? ? ? ? ? ? ? System.out.println(num2ip(Long.parseLong(s))); ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? public static long ip2num(String ip){ ? ? ? ? String[] iip = ip.split("\\."); ? ? ? ? Long ans = (long)0; ? ? ? ? for(int i = 0; i<4; i++){ ? ? ? ? ? ? ans = ans * 256 + Long.parseLong(iip[i]); ? ? ? ? } ? ? ? ? return ans; ? ? } ? ? public static String num2ip(long num){ ? ? ? ? String[] ans = new String[4]; ? ? ? ? for(int i=3; i>=0; i--){ ? ? ? ? ? ? ans[i] = Long.toString(num % 256); ? ? ? ? ? ? num = num / 256; ? ? ? ? } ? ? ? ? return String.join(".", ans); ? ? } }
到此這篇關于基于Java解決華為機試實現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換 的文章就介紹到這了,更多相關Java實現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java 利用binarySearch實現(xiàn)抽獎計算邏輯
這篇文章主要介紹了Java 利用binarySearch實現(xiàn)抽獎計算邏輯,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12maven-maven使用-P參數(shù)打包不同環(huán)境問題
這篇文章主要介紹了maven-maven使用-P參數(shù)打包不同環(huán)境問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11java開發(fā)之基于Validator接口的SpringMVC數(shù)據(jù)校驗方式
這篇文章主要介紹了java開發(fā)之基于Validator接口的SpringMVC數(shù)據(jù)校驗方式,文中附含詳細示例代碼,有需要的朋友可以借鑒參考下2021-09-09SpringBoot項目訪問任意接口出現(xiàn)401錯誤的解決方案
今天小編就為大家分享一篇關于SpringBoot項目訪問任意接口出現(xiàn)401錯誤的解決方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01springboot+jsonp解決前端跨域問題小結(jié)
這篇文章主要介紹了springboot+jsonp解決前端跨域問題小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06