记录一道算法题-split和Integer.parseInt()

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 记录一道算法题-split和Integer.parseInt()

题目

先来看下题目描述

描述

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址

IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(“.”)分割。比如,172.16.254.1;

同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。

IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (“:”)分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。

然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (:😃 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。

同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。

说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。

import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public String solve (String IP) {
        // write code here
        String[] ipv4 = IP.split("\\.",-1);
        String[] ipv6 = IP.split(":",-1);
        if (ipv4.length ==4) {
            if (valid4(ipv4)) {
                return "IPv4";
            } else {
                return "Neither";
            }
        }
        if (ipv6.length ==8) {
            if (valid6(ipv6)) {
                return "IPv6";
            } else {
                return "Neither";
            }
        }
        return "Neither";
    }
    private boolean valid4(String[] ipv4) {
        if (ipv4.length != 4) {
            return false;
        }
        for (int i = 0; i < ipv4.length; i++) {
            if (ipv4[i].length() > 1 && ipv4[i].startsWith("0")) {
                return false;
            }
            try {
                int val = Integer.parseInt(ipv4[i]);
                if (!(val >= 0 && val <= 255)) {
                    return false;
                }
            } catch (NumberFormatException numberFormatException) {
                return false;
            }
        }
        return true;
    }
    private boolean valid6(String[] ipv6) {
        if (ipv6.length != 8) {
            return false;
        }
        for (int i = 0; i < ipv6.length; i++) {
            if (ipv6[i].length() > 4 || ipv6[i].length() == 0) {
                return false;
            }
            try {
                int val = Integer.parseInt(ipv6[i], 16);
            } catch (NumberFormatException numberFormatException) {
                return false;
            }
        }
        return true;
    }
}

知识点

在这个算法题里,有两个我之前写代码没有注意到的点,第一个是非常常用的split,第二个是string转int的方式,下面一个一个说。

分割字符串

假设这是我们要分割的内容: String IP="2001:0db8:85a3:0:0:8A2E:0370:7334:"

IP.split(":", -1)IP.split(":")在使用上有以下区别:

  1. IP.split(":", -1)
  • 当第二个参数为负数时,split()方法会保留字符串末尾的空字符串元素。
  • 在给定的IP地址中,末尾有一个额外的冒号":",如果使用split(":", -1),则会保留末尾的空字符串。
  • 结果数组中的最后一个元素会是空字符串,因为冒号":"位于末尾。
  1. IP.split(":")
  • 当不指定第二个参数或者第二个参数为非负数时,split()方法会自动忽略末尾的空字符串元素。
  • 在给定的IP地址中,末尾有一个额外的冒号":",如果使用split(":"),则会自动忽略末尾的空字符串。
  • 结果数组中的最后一个元素不会是空字符串,因为默认情况下,split()方法会忽略末尾的空字符串。

下面是一个示例:

public class SplitExample {
    public static void main(String[] args) {
        String IP = "2001:0db8:85a3:0:0:8A2E:0370:7334:";
        String[] splitArray1 = IP.split(":", -1);
        String[] splitArray2 = IP.split(":");
        System.out.println("Using split(\":\", -1):");
        for (String element : splitArray1) {
            System.out.println("[" + element + "]");
        }
        System.out.println("Using split(\":\"):");
        for (String element : splitArray2) {
            System.out.println("[" + element + "]");
        }
    }
}

输出结果:

Using split(":", -1):
[2001]
[0db8]
[85a3]
[0]
[0]
[8A2E]
[0370]
[7334]
[]
Using split(":"):
[2001]
[0db8]
[85a3]
[0]
[0]
[8A2E]
[0370]
[7334]

可以看到,使用split(":", -1)保留了最后的空字符串,而使用split(":")则自动忽略了最后的空字符串。

String转int

比如解中的代码 Integer.parseInt(ipv6[i], 16)

在给定的代码中,Integer.parseInt(ipv6[i], 16)中的第二个参数 16 表示要解析的整数字符串 ipv6[i] 是一个十六进制表示的整数。

Integer.parseInt(String s, int radix) 是 Java 中用于将字符串转换为整数的方法。radix 参数指定了输入字符串 s 的进制。

radix 的值为 16 时,parseInt 方法会将输入的字符串 s 视为一个十六进制数,并将其转换为对应的整数值。

例如:

String hexString = "1A"; // 十六进制表示的字符串
int val = Integer.parseInt(hexString, 16); // 解析十六进制字符串为整数
System.out.println(val); // 输出: 26

在上述例子中,hexString 是一个十六进制表示的字符串,使用 Integer.parseInt(hexString, 16) 将其解析为整数 26,因为十六进制 1A 对应的十进制数值是 26

总结:parseInt(String s, int radix) 方法中的第二个参数 radix 指定了输入字符串 s 的进制,当 radix16 时,输入字符串被视为十六进制数进行解析。

目录
相关文章
ML之xgboost:利用xgboost算法(sklearn+3Split)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)
ML之xgboost:利用xgboost算法(sklearn+3Split)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)
ML之xgboost:利用xgboost算法(sklearn+3Split)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)
|
15天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
21天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
1天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。
|
9天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。
|
17天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
9天前
|
机器学习/深度学习 算法 信息无障碍
基于GoogleNet深度学习网络的手语识别算法matlab仿真
本项目展示了基于GoogleNet的深度学习手语识别算法,使用Matlab2022a实现。通过卷积神经网络(CNN)识别手语手势,如&quot;How are you&quot;、&quot;I am fine&quot;、&quot;I love you&quot;等。核心在于Inception模块,通过多尺度处理和1x1卷积减少计算量,提高效率。项目附带完整代码及操作视频。
|
14天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。
|
18天前
|
算法
通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法
本项目使用MATLAB2022A版本,对比分析了PSO、反向学习PSO及多策略改进反向学习PSO三种优化算法的性能,主要通过优化收敛曲线进行直观展示。核心代码实现了标准PSO算法流程,加入反向学习机制及多种改进策略,以提升算法跳出局部最优的能力,增强全局搜索效率。
|
12天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于深度学习网络的宝石类型识别算法matlab仿真
本项目利用GoogLeNet深度学习网络进行宝石类型识别,实验包括收集多类宝石图像数据集并按7:1:2比例划分。使用Matlab2022a实现算法,提供含中文注释的完整代码及操作视频。GoogLeNet通过其独特的Inception模块,结合数据增强、学习率调整和正则化等优化手段,有效提升了宝石识别的准确性和效率。
下一篇
DataWorks