密码合格性校验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
- 整数转ipv4
1. 方法一:我的方法
整数字符串转成long类型
long类型转成二进制字符串形式
二进制字符串截取转成int类型
打印拼接结果
3. 方法二:借鉴方法 - 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]);
}
}
总结:
- 学习了正则表达是匹配【密码和IP地址匹配】
- java自带API包括进制转换,字符串转换。