基于Java解決華為機(jī)試實(shí)現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換?
1.簡(jiǎn)述
描述:
原理:ip地址的每段可以看成是一個(gè)0-255的整數(shù),把每段拆分成一個(gè)二進(jìn)制形式組合起來,然后把這個(gè)二進(jìn)制數(shù)轉(zhuǎn)變成
一個(gè)長(zhǎng)整數(shù)。
舉例:一個(gè)ip地址為10.0.3.193
每段數(shù)字 相對(duì)應(yīng)的二進(jìn)制數(shù)
10 00001010
0 00000000
3 00000011
193 11000001
組合起來即為:00001010 00000000 00000011 11000001,轉(zhuǎn)換為10進(jìn)制數(shù)就是:167773121,即該IP地址轉(zhuǎn)換后的數(shù)字就是它了。
本題含有多組輸入用例,每組用例需要你將一個(gè)ip地址轉(zhuǎn)換為整數(shù)、將一個(gè)整數(shù)轉(zhuǎn)換為ip地址。
數(shù)據(jù)范圍:保證輸入的是合法的 IP 序列
輸入描述:
輸入 :
- 1 輸入IP地址
- 2 輸入10進(jìn)制型的IP地址
輸出描述:
輸出:
- 1 輸出轉(zhuǎn)換成10進(jìn)制的IP地址
- 2 輸出轉(zhuǎn)換后的IP地址
示例1
輸入:
10.0.3.193 167969729
輸出:
167773121
10.3.3.193
2.代碼實(shí)現(xiàn)
方法一:通過二進(jìn)制進(jìn)行轉(zhuǎn)換
具體方法:
在問題中有兩個(gè)轉(zhuǎn)換過程,一個(gè)是將ip地址轉(zhuǎn)換為長(zhǎng)整數(shù),一個(gè)是將長(zhǎng)整數(shù)轉(zhuǎn)換為ip地址,通過題目中的轉(zhuǎn)換過程進(jìn)行轉(zhuǎn)換。 對(duì)于ip地址轉(zhuǎn)換成長(zhǎng)整數(shù): 1、將ip地址切割成四段數(shù)字 2、每段數(shù)字用8位2二進(jìn)制數(shù)字表示 3、將四段二進(jìn)制數(shù)字組合 4、將二進(jìn)制數(shù)字轉(zhuǎn)換成長(zhǎng)整數(shù) 對(duì)于長(zhǎng)整數(shù)轉(zhuǎn)換成ip地址則步驟相反 1、將長(zhǎng)整數(shù)轉(zhuǎn)換成32位二進(jìn)制數(shù)字 2、將32位二進(jìn)制數(shù)字進(jìn)行切割 3、將每段的二進(jìn)制數(shù)字轉(zhuǎn)換為十進(jì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)換為二進(jìn)制
? ? ? ? ? ? while(num2.length()<8){
? ? ? ? ? ? ? ? num2 = "0" + num2; ?// 拼接
? ? ? ? ? ? }
? ? ? ? ? ? sb.append(num2);
? ? ? ? }
? ? ? ? return Long.parseLong(sb.toString(), 2); ?// 轉(zhuǎn)化為10進(jìn)制
? ? }
? ? public static String num2ip(long num){
? ? ? ? String num2 = Long.toBinaryString(num); ?//轉(zhuǎn)換為2進(jìn)制
? ? ? ? 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進(jìn)制
? ? ? ? ? ? ans[i] = s;
? ? ? ? }
? ? ? ? return String.join(".", ans); ?//拼接
? ? }
}方法二:直接轉(zhuǎn)換(10進(jìn)制和256進(jìn)制)
具體方法:
在第一種方法中,我們通過二進(jìn)制進(jìn)行轉(zhuǎn)換,但是仔細(xì)分析之后,我們發(fā)現(xiàn),二進(jìn)制在轉(zhuǎn)換過程中并沒有起到作用,再進(jìn)行重新分析,我們可以發(fā)現(xiàn),ip地址實(shí)際上是256進(jìn)制下的四位數(shù)字,所以我們可以直接進(jìn)行轉(zhuǎn)換,將10進(jìn)制轉(zhuǎn)化為256進(jìn)制。
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);
? ? }
}到此這篇關(guān)于基于Java解決華為機(jī)試實(shí)現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換 的文章就介紹到這了,更多相關(guān)Java實(shí)現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 基于Java解決華為機(jī)試實(shí)現(xiàn)密碼截取?
- 基于Java解決華為機(jī)試之字符串加解密?
- ?基于Java解決華為機(jī)試之字符串合并處理實(shí)操
- java實(shí)現(xiàn)IP地址轉(zhuǎn)換
- Java實(shí)現(xiàn)IP地址到二進(jìn)制的轉(zhuǎn)換
- Java實(shí)現(xiàn)ip地址和int數(shù)字的相互轉(zhuǎn)換
- Java編程IP地址和數(shù)字相互轉(zhuǎn)換代碼示例
- 使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法
- java實(shí)現(xiàn)ip地址與十進(jìn)制數(shù)相互轉(zhuǎn)換
相關(guān)文章
Java中使用注解校驗(yàn)手機(jī)號(hào)格式的詳細(xì)指南
在現(xiàn)代的Web應(yīng)用開發(fā)中,數(shù)據(jù)校驗(yàn)是一個(gè)非常重要的環(huán)節(jié),本文將詳細(xì)介紹如何在Java中使用注解對(duì)手機(jī)號(hào)格式進(jìn)行校驗(yàn),感興趣的小伙伴可以了解下2025-03-03
Java模擬有序鏈表數(shù)據(jù)結(jié)構(gòu)的示例
這篇文章主要介紹了Java模擬有序鏈表數(shù)據(jù)結(jié)構(gòu)的示例,包括一個(gè)反序的單鏈表結(jié)構(gòu)的例子,需要的朋友可以參考下2016-04-04
簡(jiǎn)單了解java函數(shù)式編碼結(jié)構(gòu)及優(yōu)勢(shì)
這篇文章主要介紹了簡(jiǎn)單了解java函數(shù)式編碼結(jié)構(gòu)及優(yōu)勢(shì),本文將探討三種下一代 JVM 語言:Groovy、Scala 和 Clojure,比較并對(duì)比新的功能和范例,讓 Java 開發(fā)人員對(duì)自己近期的未來發(fā)展有大體的認(rèn)識(shí)。,需要的朋友可以參考下2019-06-06
關(guān)于集合和字符串的互轉(zhuǎn)實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄P(guān)于集合和字符串的互轉(zhuǎn)實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08
mybatis類型轉(zhuǎn)換器如何實(shí)現(xiàn)數(shù)據(jù)加解密
這篇文章主要介紹了mybatis類型轉(zhuǎn)換器如何實(shí)現(xiàn)數(shù)據(jù)加解密,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
在已經(jīng)使用mybatis的項(xiàng)目里引入mybatis-plus,結(jié)果不能共存的解決
這篇文章主要介紹了在已經(jīng)使用mybatis的項(xiàng)目里引入mybatis-plus,結(jié)果不能共存的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
SpringBoot整合Echarts實(shí)現(xiàn)數(shù)據(jù)大屏
這篇文章給大家介紹了三步實(shí)現(xiàn)SpringBoot全局日志記錄,整合Echarts實(shí)現(xiàn)數(shù)據(jù)大屏,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-03-03
使用Spring Boot輕松實(shí)現(xiàn)流式AI輸出的步驟
本文介紹了如何使用Spring Boot和WebFlux實(shí)現(xiàn)流式AI輸出,通過非阻塞I/O、反應(yīng)式編程和函數(shù)式路由等技術(shù),優(yōu)化了AI應(yīng)用的響應(yīng)速度,提升了用戶體驗(yàn),感興趣的朋友一起看看吧2025-02-02

