输入 | 输出 | 说明 |
---|---|---|
100#101#1#5 | 1684340997 | 无 |
1#2#3 | invalid IP | 无 |
源码和解析
解析:
1.字符串按#号拆分 若分为四段 且每段数字都在范围内 ,那么ip合规 。否则输出invalid IP
2.将每段ip转成16进制,注意转换后每段2位,拼接为16进制字符串 最后再输出16进制对应的10进制即可
注意:Integer.parseInt()方法转换时最大值为 2147483647 范围不够 因此使用时使用Long.parseLong()方法进行进制转换
128#0#255#255,转换为32位整数的结果为2147549183>2147483647
示例代码:
public class T2 {
public static void main(String[] args) {
String input="128#168#100#5";
String[] ipArr=input.split("#");
//长度校验
if(ipArr.length!=4){
System.out.println("invalid IP");
System.exit(0);
}
// 数字范围校验
if(1>Integer.parseInt(ipArr[0])||Integer.parseInt(ipArr[0])>128){
System.out.println("invalid IP");
System.exit(0);
}
for(int i=1;i<4;i++){
if(0>Integer.parseInt(ipArr[i])||Integer.parseInt(ipArr[i])>255){
System.out.println("invalid IP");
System.exit(0);
}
}
//10进制转换为16进制
String oxStr="";
for(int i=0;i<4;i++){
ipArr[i]=Integer.toString(Integer.parseInt(ipArr[i]),16);
if(ipArr[i].length()==1){
ipArr[i]="0"+ipArr[i];
}
oxStr+=ipArr[i];
}
//System.out.println(oxStr);
//16进制转换为10进制
System.out.println(Long.parseLong(oxStr, 16));
}
}
3.VLAN资源池
题目描述
VLAN是一种对局域网设备进行逻辑划分的技术,为了标识不同的VLAN,引入VLAN ID(1-4094之间的整数)的概念。
定义一个VLAN ID的资源池(下称VLAN资源池),资源池中连续的VLAN用开始VLAN-结束VLAN表示,不连续的用单个整数表示,所有的VLAN用英文逗号连接起来。
现在有一个VLAN资源池,业务需要从资源池中申请一个VLAN,需要你输出从VLAN资源池中移除申请的VLAN后的资源池。
输入描述
第一行为字符串格式的VLAN资源池,第二行为业务要申请的VLAN,VLAN的取值范围为[1,4094]之间的整数。
输出描述
从输入VLAN资源池中移除申请的VLAN后字符串格式的VLAN资源池,输出要求满足题目描述中的格式,并且按照VLAN从小到大升序输出。
如果申请的VLAN不在原VLAN资源池内,输出原VLAN资源池升序排序后的字符串即可。
输入1 | 输入2 | 输出 | 说明 |
---|---|---|---|
1-5 | 2 | 1,3-5 | 原VLAN资源池中有VLAN 1、2、3、4、5,从资源池中移除2后,剩下VLAN 1、3、4、5,按照题目描述格式并升序后的结果为1,3-5。 |
20-21,15,18,30,5-10 | 15 | 5-10,18,20-21,30 | 原VLAN资源池中有VLAN 5、6、7、8、9、10、15、18、20、21、30,从资源池中移除15后,资源池中剩下的VLAN为 5、6、7、8、9、10、18、20、21、30,按照题目描述格式并升序后的结果为5-10,18,20-21,30。 |
5,1-3 | 10 | 1-3,5 | 原VLAN资源池中有VLAN 1、2、3,5,申请的VLAN 10不在原资源池中,将原资源池按照题目描述格式并按升序排序后输出的结果为1-3,5。 |
源码和解析
解析:
可以将输入的资源池 转换为数组 例如1,3-5=> [1,3,4,5] 移除目标资源3后再重新合并为 [1,4-5]
示例代码:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class T3 {
public static void main(String[] args) {
//输入的VLAN串 20-21,15,18,30,5-10
String input="20-21,15,18,30,5-10";
//要申请的VLAN资源
Integer destVlan=15;
//获得VLAN池
List<Integer> vlanPool=new ArrayList<Integer>();//VLAN池
String[] vlanGroup=input.split(",");
for(int i=0;i<vlanGroup.length;i++){
if(vlanGroup[i].contains("-")){
String vlanItems[]=vlanGroup[i].split("-");
Integer start=Integer.parseInt(vlanItems[0]);
Integer end=Integer.parseInt(vlanItems[1]);
for(int j=start;j<=end;j++){
vlanPool.add(j);
}
continue;
}
vlanPool.add(Integer.parseInt(vlanGroup[i]));
}
//升序排序
vlanPool.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if(o1>o2){
return 1;
}
if(o1<o2){
return -1;
}
return 0;
}
});
//移出要移出的那个数
vlanPool.remove(destVlan);//注意目标vlan要保持和List的值相同
String result="";
Integer last=null;//记录追加的最后一个值
for(int index=0;index<vlanPool.size();index++){
if(last==null){
result+=vlanPool.get(index);
last=vlanPool.get(index);
continue;
}
if(vlanPool.get(index)-last==1){
if(result.endsWith("-"+last)){
//已经有一个结束的数字了 那么就替换掉这个
result=result.replace(last+"", vlanPool.get(index)+"");
}else{
result+="-"+vlanPool.get(index);
}
}else{
result+=","+vlanPool.get(index);
}
last=vlanPool.get(index);
}
System.out.println(vlanPool);
System.out.println(result);
}
}
4. 求字符串中所有整数的最小和
题目描述
输入字符串s,输出s中包含所有整数的最小和。
说明:
字符串s,只包含 a-z A-Z ± ;合法的整数包括
1) 正整数 一个或者多个0-9组成,如 0 2 3 002 102
2) 负整数 负号 – 开头,数字部分由一个或者多个0-9组成,如 -0 -012 -23 -00023
输入描述
包含数字的字符串
输出描述
所有整数的最小和
输入 | 输出 | 说明 |
---|---|---|
bb1234aa | 10 | 1+2+3+3=10 |
b12-34aa | -31 | 1+2+(-34) = -31 |
源码和解析
解析:
若字符串全是整数,那么直接逐个抽离出数字相加即可
若字符串包含负数,那么需要尽可能让负数(绝对值最大)最小
注意字符中对减号的处理
示例代码:
import java.util.ArrayList;
import java.util.List;
public class T4 {
public static void main(String[] args) {
String input="b12-34aA1C79-3A";
//转换成单字符数组
char[] singleCases=input.toCharArray();
List<Integer> numberList=new ArrayList<Integer>();
boolean flag=false;
String negNumer="-"; //记录负数
for(char sc:singleCases){
if( (sc>='a'&&sc<='z') || (sc>='A'&&sc<='Z') || (sc=='+')){
//是字符 给过滤掉 字符会截断负数 让负数达不到最小
flag=false;
if(!negNumer.equals("-")){
numberList.add(Integer.parseInt(negNumer));
}
negNumer="-";
continue;
}
if(sc=='-'){
flag=true;
negNumer="-";
continue;
}
if(flag==true){
negNumer+=sc;
continue;
}else{
numberList.add(Integer.parseInt(sc+""));
}
}
//求和
Integer sum=0;
for(Integer item:numberList){
sum+=item;
}
System.out.println(numberList);
System.out.println("最小和为:"+sum);
}
}
5.求满足条件的最长子串的长度
题目描述
给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:
1、 只包含1个字母(a-z, A-Z),其余必须是数字;
2、 字母可以在子串中的任意位置;
如果找不到满足要求