华为机试准备刷题第二天

密码合格性校验HJ20

正则表达式匹配
在这里插入图片描述

2.删除字符串中出现次数最少的字符HJ23

使用了hashmap, 增强for循环,构建字符串Stringbuilder及append()方法。

import java.util.Scanner;
import java.util.HashMap;
import java.util.Set;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            //将字符串放入hashmap中
            String str = in.next();
            HashMap<Character, Integer> map = new HashMap<>();
            char[] cc = str.toCharArray();
            for(char c : cc){
                if(map.containsKey(c)){
                    map.put(c,map.get(c)+1);
                }else{
                    map.put(c,1);
                }
            }
			//得到出现次数最少的字符串
            int min = 20;
            for(char c : map.keySet()){
                if(map.get(c) < min){
                    min = map.get(c);
                }
            }
			//不采用删除,而是重新构建字符串
            StringBuilder builder = new StringBuilder();
            for(char c : cc){
                if(map.get(c) > min){
                    builder.append(c);
                }
            }
            System.out.println(builder);
        }     
    }
}

3.整数与IP地址的转换HJ33

  1. 整数转ipv4
    1. 方法一:我的方法
    整数字符串转成long类型
    long类型转成二进制字符串形式
    二进制字符串截取转成int类型
    打印拼接结果
    3. 方法二:借鉴方法
  2. ipv4转整数
    1. 方法一:我的方法
    根据“.”将Ipv4形式的字符串分割开;split(“\.”)
    每个字符串转int类型
    int类型转二进制并且前面空位补0,存放进数组
    最后将二进制数组转long类型。
    2. 方法二:借鉴方法-使用了Java提供进制转换和字符串转换的API
    根据“.”将Ipv4形式的字符串分割开;split(“\.”)
    每个字符串转int类型 Integer.parseint(str)
    int类型转二进制字符串并且前面空位补0,存放进数组Integer.fomat(%8s) ,Integer.toBinaryString(str).replace(’ ',‘0’);
    最后将二进制字符串转long类型。Long.parseint(format);
import java.util.*;
import java.util.regex.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String str = in.nextLine();
            //Pattern p =
                //Pattern.compile("((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}25[0-5]|2[0-4][0-9][01]?[0-9][0-9]?");
            if (str.contains(".")) { //Ipv4->int
                String[] s = str.split("\\.");//IP分隔符分开
                int[] num = new int[32];    //存放二进制
                int index = 0;
                long res = 0;
                for (int i = 3; i >= 0; i--) {
                    int n = Integer.parseInt(s[i]);
                    while (n != 0) {              //一个IP分段的十进制转二进制存入数组中
                        num[index++] = n % 2;
                        n /= 2;
                    }
                    while (index < 8 * (4 - i)) { //前面补0
                        num[index++] = 0;
                    }
                }
                for (int i = 0; i < 32; i++) {    //二进制转十进制
                    res += num[i] * Math.pow(2, i);
                }
                System.out.println(res);
            } else { //int->ipv4
                long[] num = new long[32];
                int index = 0;
                long n = Long.valueOf(str);
                while (n != 0) {
                    num[index++] = n % 2;
                    n /= 2;
                }
                while (index < 32) {
                    num[index++] = 0;
                }
                int[] res = new int[4];  //存放IP地址的每个分段
                int result;
                index = 0;
                for (int i = 0; i < 4; i++) {
                    result = 0;
                    for (int j = 0; j < 8; j++) {
                        result += num[index++] * Math.pow(2, j);
                    }
                    res[i] = result;
                }
                System.out.printf("%d" + "." + "%d" + "." + "%d" + "." + "%d\n", res[3], res[2],
                                  res[1], res[0]);
            }
        }
    }
}
import java.util.*;
import java.util.regex.*;
/*
这是方法二:
逻辑更加规范
使用了java自带的API 简化了代码量,
包括字符串转int,十进制转二进制字符串(指定8位,空位用0补),字符串的拼接,二进制的字符串转十进制。
包括字符串转长整型,长整型转二进制字符串(指定32位,空位用0补),字符串的截取,字符串转十进制。
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String str = in.nextLine();
            if (str.contains(".")) { //Ipv4->int
                Ipv4TurnLong(str);
            } else {                 //int->ipv4
                LongTurnIpv4(str);
            }
        }
    }
    private static void Ipv4TurnLong(String str) {
        String[] s = str.split("\\.");
        String binary = "";
        for(String ss:s){
            String format = String.format("%8s",Integer.toBinaryString(Integer.parseInt(ss))).replace(' ','0');
            binary = binary.concat(format);
        }
        System.out.println(Long.parseLong(binary,2));
    }

    private static void LongTurnIpv4(String str) {
        int[] res = new int[4];
        String binaryString = String.format("%32str",Long.toBinaryString(Long.parseLong(str))).replace(' ','0');
        for(int i=0;i<4;i++){
            res[i] = Integer.parseInt(binaryString.substring(i*8,(i+1)*8),2);
        }
        System.out.printf("%d.%d.%d.%d",res[0],res[1],res[2],res[3]);
    }
}

总结:

  1. 学习了正则表达是匹配【密码和IP地址匹配】
  2. java自带API包括进制转换,字符串转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值