华为机试题

1.求解M的N次方的最后三位数(M,N均大于10)。

当m, n很大时, m的n次方无法用基本的数据类型表示...分析可以发现, 乘积的最后三位只与乘数和被乘数的最后三位有关, 而与高位无关, 所以每次将乘积结果对1000取模即可...

2.逆序排序

 Collections.reverse(list);

Collections.reverse(Arrays.asList(Array));//可以对Object数组排序

这个方法排序之后,数组就变成了一个List了,所以需要先用一个List把Arrays.asList(Array)接收,然后对List逆序,最后再把List元素逐个赋值给数组,这样就返回了一个数组。代码如下:

ArrayList<Integer>l=new ArrayList<Integer>(Arrays.asList(pIntegerArray));
       Collections.reverse(l);    //反转列表顺序,所以想要逆序排列的话,先要排序,因为它只是反序输出,并没有排序功能,所以要自己先排序

注意这一句 ArrayList<Integer>l=new ArrayList<Integer>(Arrays.asList(pIntegerArray));    //ArrayList的一种构造方法

不能写成ArrayList<Integer>l=(ArrayList<Integer>)(Arrays.asList(pIntegerArray));否则抛出类型转换异常。。。


Arrays.sort(int[], Comparator.reverseOrder());  //不能对Object数组排序

3.判断字符串是否是有效数字,是则返回0,不是则返回-1

 

接口
int NumType(String s)

 

举例
例如:输入的字符串是123.456,返回0
      输入123a,返回-1
      输入123.456d,返回0

判断一个字符不是数字的时候,应该是if(!(s.charAt(i)>='0'&&s.charAt(i)<='9'))而不是if(s.charAt(i)<'0'&&s.charAt(i)>'9')),刚开始写错了,完全搞反了,汗。。。

写了一大堆代码,测试用例过了,但是提交上去,8个测试用例有两个未通过,说明肯定还是有问题的。。。

突然灵光一现,想到了系统自带的方法Double.parseDouble(String s)方法,于是再看看题,我就说呢,第一次做这个题的时候,题目下方显示 知识点:使用Double类自带的静态方法,当时我没懂,现在我想,不会真的是这样吧!于是代码如下:

public int NumType(String s)
{
if(s.length()==0||s==null)
return -1;
try{
double a=Double.parseDouble(s);
return 0;
}catch(Exception e){
return -1;
}

}

还真的对了!长经验+1


4.判断自守数

  • 自守数

  • 如果某个数的平方的末尾几位数等于这个数,那么就称这个数为自守数。

  • 显然,5和6是一位自守数(5x5=25 6x6=36),25x25=625 76x76=5776,所以25和76是两位自守数。

刚开始一直有一个测试用例未通过,不知道什么原因,后来经大神指点,int num取平方之后,很可能超出了int的范围,因此需要用bigInteger

BigInteger n = new BigInteger(String.valueOf(num));
BigInteger a = n.multiply(n);

这样做就对了,然后后面用字符串处理。

  if(a%count==Math.abs(num))      //%不能用于两个BigInteger求模,可以用Mod(BigInteger m)来实现
                                                     //BigInteger也是引用类型变量,所以要用方法。


用long也可以

long square = (long) Math.pow(num, 2);


5.判断IP地址合法性

现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。
现在需要你用程序来判断IP是否合法。


这道题网上都说用正则表示做,但是我没学正则表达式,而且IP地址的正则表达式实在太长了,听大神说,正则表达式能不用就不用,太慢了,先看正则表达式解法:

if(Pattern.matches( "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."  
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."  
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."  
            + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$",inputStr))
outputStr.append("YES");
else 
outputStr.append("NO");


话说这个正则表达式也未必完全对。。。

现在看我的String解法,遇到一个很奇怪的现象,

String s="192.168.0.0";
String[] ss=s.split(".");
System.out.println(ss.length);

这段程序的输出结果竟然是0.。。百思不得其解,,,

于是大神告诉我,“.”是特殊字符,代表任意字符,要转义,下面这样写就对了:

String s="192.168.0.0";
String[] ss=s.split("\\.");
System.out.println(ss.length);

输出结果为4


但是在用函数String.indexOf(".")的时候不用加\\,直接写就好了。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值