牛客网刷题第三天 | HJ32 密码截取、HJ33 整数与IP地址间的转换、

HJ32 密码截取

首先确定回文串,就是找中心然后向两边扩散看是不是对称的就可以了。

在遍历中心点的时候,要注意中心点有两种情况

一个元素可以作为中心点,两个元素也可以作为中心点。

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        int length1 = 0;
        int length2 = 0;
        int result = 0;
        for (int i = 0; i < str.length(); i++) {
            length1 = Math.max(length1, getRes(str, i, i, str.length()));
            length2 = Math.max(length2, getRes(str, i, i+1, str.length()));
            result = length1 >= length2 ? length1 : length2;
        }
        System.out.print(result);
    }

    public static int getRes(String str, int i, int j, int length) {
        int res = 0;
        while (i >= 0 && j < length && str.charAt(i) == str.charAt(j)) {
            res = j - i + 1;
            i--;
            j++;
        }
        return res;
    }
}

HJ33 整数与IP地址间的转换

牛客网大佬思路:

1.输入IP地址,输出10进制的IP地址

每次获取的一个字段值,与下个字段值相加时,乘256,如果这里不懂可以手动模拟一下

2.输入10进制IP地址,输出32位二进制的IP地址

同样也是按照256进行的,每一个字段都是当前值对256的余数

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //输入IP地址;输出转换成10进制的IP地址
        String str = in.nextLine();
        String[] strs = str.split("\\.");//将每一段存入数组中

        long result = 0;
        for (int i = 0; i < 4; i++) {
            
            result = result * 256 + Integer.parseInt(strs[i]);;
            
        }
        System.out.println(result);
        
        //输入10进制型的IP地址;输出转换后的IP地址
        String str1 = in.nextLine();
        long num = Long.parseLong(str1);
        String res = "";
        for (int i = 0; i < 4; i++) {
            res = num % 256 +"." + res;
            num /= 256;
        }
        System.out.println(res.substring(0, res.length() - 1));
    }
}

个人思路:

1.输入IP地址,输出10进制的IP地址

先将每个字段转换为二进制,不足8位补0(使用String.format()),将二进制字符串拼接存入StringBuilder,然后将字符串转换为十进制(注意使用Long.parseLong())

2.输入10进制IP地址,输出32位二进制的IP地址

将十进制转换为32位二进制数,不足补0,从前往后8位截取,转换为十进制

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //输入IP地址;输出转换成10进制的IP地址
        String str = in.nextLine();
        String[] strs = str.split("\\.");//将每一段存入数组中
        StringBuilder sb = new StringBuilder();
       
        for (int i = 0; i < 4; i++) {
            int n = Integer.parseInt(strs[i]);
            // Integer.toBinaryString(n)
            sb.append(String.format("%8s", Integer.toBinaryString(n)).replace(' ', '0'));
            
        }
        System.out.println(Long.parseLong(sb.toString(), 2));
        
        //输入10进制型的IP地址;输出转换后的IP地址
        String str1 = in.nextLine();
        long num = Long.parseLong(str1);
        String res = String.format("%32s", Long.toBinaryString(num)).replace(' ', '0');
        for (int i = 0; i < 4; i++) {
            String tmp = res.substring(i*8, i*8+8);
            System.out.print(Integer.parseInt(tmp, 2));
            if (i != 3) {
                System.out.print(".");
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值