华为OD机试(1-20)老题库解析&Java源码系列连载ing_华为od机试题目讲解

输入 输出 说明
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、 字母可以在子串中的任意位置;
如果找不到满足要求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值