您的位置:首页 > 编程语言 > Java开发

华为上机题整理1——Java实现

2016-07-20 20:56 736 查看
      最近开始练习华为的上机题,发现网上有些代码运行时不是很符合题目要求,故加以整理,用测试用例亲测通过~

     本文是在原有代码上改进,所以,首先要感谢原作者,原文链接

                                                                   http://blog.csdn.net/dengpeng0419/article/details/47622727

                                                                   http://blog.csdn.net/dengpeng0419/article/details/47622727

下面进入正题:

1.超长整数相加



java代码:

import java.util.Scanner;
public class AddMain {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int a,b;
while(in.hasNext()){
//-读取字符串--------------------------------
String aStr=in.nextLine();
String bStr=in.nextLine();
//----------------------------
char[] aChar=aStr.toCharArray();
char[] bChar=bStr.toCharArray();
int num1=aStr.length();
int num2=bStr.length();
int num=num1>=num2?num1:num2;
System.out.println("num="+num);
int[] s=new int[num+1];
int[] s1=new int[num];
int[] s2=new int[num];
//-将单个char字符存进数组,以便后面相加---------------------------
for(int i=0;i<num1;i++){
aChar[i]=aStr.charAt(i);
s1[i]=aChar[i]-'0';
}
for(int i=0;i<num2 i="" bchar="" i="" bstr="" charat="" i="" s2="" i="" bchar="" i="" -="" 0="" int="" flag="0;//进位标志" for="" int="" i="num-1;i">=0;i--){
s[i]=(s1[i]+s2[i]+flag)%10;
//System.out.println("s[i]="+s[i]);
if((s1[i]+s2[i]+flag)>=10){
flag=1;
}else{
flag=0;
}
}
//--------------------------------------
for(int i=0;i<=num;i++){
if(s[num]>0){
System.out.print(s[num]);
}
if(i<num){
System.out.print(s[i]);;
}
}
}
}
}
</num2>


代码解析:

   一定要注意,题目是“超长整数”,意味着读入的是字符串,而不是整数,所以,不能用下面的代码来读取键盘输入,

int a=in.nextInt();
int b=in.nextInt();


否则会报错误:

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:840)
at java.util.Scanner.next(Scanner.java:1461)
at java.util.Scanner.nextInt(Scanner.java:2091)
at java.util.Scanner.nextInt(Scanner.java:2050)



当然,一般整数的输入,这样读取ok



归纳总结:

    初看题目,第一反应是可以用“大数值”来做,直接调用

BigInteger add(BigInteger other)



觉得很easy,但别忘了,人家叫你用算法实现。考的还是字符串类的基础知识!

2.城市电话号码



java代码:

import java.util.Scanner;
public class PhoneNumber {
public static void main(String[] args){
char[] c1;
char[] c2;
char[] c3;
Scanner in=new Scanner(System.in);
while(in.hasNext()){
String str1=in.nextLine();
String str2=in.nextLine();
String str3=in.nextLine();
c1=str1.toCharArray();
c2=str2.toCharArray();
c3=str3.toCharArray();
boolean flag0=false; //判断所有输入的位数是够正确
boolean flag1=false; //判断地区码格式
boolean flag2=false; //判断前缀格式
boolean flag3=false;  //判断后缀格式
System.out.println("第一个长度="+c1.length+"第二个长度="+c2.length+"第三个长度="+c3.length);
//--------------------------------------------------
if((c1.length==3||c1.length==0)&& c2.length==3&&c3.length==4){
flag0=false;
}else{
System.out.println("标志位1="+true);
flag0=true;
}
/*if(c1.length!=0&&c1.length!=3 && c2.length!=3 && c3.length!=4){
System.out.println("标志位1="+true);
flag0=true;
}*/
if(c1.length!=0){
for(int i=0;i<c1 length="" i="" if="" c1="" i="">='0' && c1[i]<='9')){
flag1=true;
System.out.println("标志位2="+true);
break;
}
}
}
for(int i=0;i<c2 length="" i="" if="" i="=0){" flag2="c2[i]!=0?false:true;" break="" else="" if="" c2="" i="">='0' && c2[i]<='9')){
flag2=true;
System.out.println("标志位3="+true);
break;
}
}
for(int i=0;i<c3 length="" i="" if="" c3="" i="">='0' && c3[i]<='9')){
flag3=true;
System.out.println("标志位4="+true);
break;
}
}
if(flag0||flag1||flag2||flag3){
System.out.println(1);
}
else
{
System.out.println(0);
}

}
in.close();
}
}

</c3></c2></c1>


      

代码解析:

   一定要注意,在第一步对所有位数的判断,是所有3个中有一个位数不正确,都判定为非法,但第一个允许两种情况(0或3),这时就需要()把第一个与其他两个区别开来,不然,得不到正确的判定 结果。

    再者,在写判定条件时:

if((c1.length==3||c1.length==0)&& c2.length==3&&c3.length==4){
flag0=false;
}else{
System.out.println("标志位1="+true);
flag0=true;
}



if(c1.length!=0&&c1.length!=3 && c2.length!=3 && c3.length!=4){
System.out.println("标志位1="+true);
flag0=true;
}


有相当大差别,在逻辑上也是不对的。

归纳总结:
    操作字符串的基础知识,注意抓题眼,同时,测试用例要多试试题目没给出来的。

3.最小长方形

 



java代码:

   
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class MinRectangle {
public static void main(String[] args){
List<integer> lData=new ArrayList<integer>(); //声明一个可变数组来存放Integer对象
boolean flag=false;//设置标志位,输入两次(0,0)就代表测试用例输入结束
int testNum=0;//声明一个变量,代表测试用例的个数
//--------------------------------------------------------------
//从键盘读入数据并做简单处理
Scanner in=new Scanner(System.in); //可从键盘输入
while(in.hasNext()){  //若在从键盘读入字符串
int m=in.nextInt();
int n=in.nextInt();
if(Math.abs(m)>1000 ||Math.abs(n)>1000) return; //处理“输入的坐标值不能大于1000”
if(m==0 && n==0){  //若输入(0,0)
if(flag){  //上一次已经输入过了,是连续第二次输入(0,0),测试用例输入结束,程序退出
break;
}else{
flag=true; //一个测试用例结束
testNum++;
}
}else{
flag=false;
}
lData.add(m);
lData.add(n);
}
in.close();
//--------------------------------------------------
int size=lData.size();
int k=0;
for(int i=0;i<testNum;i++){
//初始化4个变量,分别用来存储x,y坐标的最大值和最小值
int xMax=Integer.MIN_VALUE;
int yMax=Integer.MIN_VALUE;
int xMin=Integer.MAX_VALUE;
int yMin=Integer.MAX_VALUE;

//for循环的起始值必须设在外面,要不然,没有要从头开始读取,打印输出的就不正确
for(;k<size/2;k++){
int x=lData.get(2*k);
int y=lData.get(2*k+1);
if(x==0 && y==0){
k++;
break; //一个测试用例结束
}else{
xMin=Math.min(x,xMin);
yMin=Math.min(y,yMin);
xMax=Math.max(x,xMax);
yMax=Math.max(y,yMax);
}
}
if(xMin!=xMax && yMin!=yMax &&xMin!=Integer.MAX_VALUE && yMin!=Integer.MAX_VALUE
&& xMax!=Integer.MIN_VALUE && yMax!=Integer.MIN_VALUE){
System.out.println(xMin+" "+yMin+" "+xMax+" "+yMax);
}
}
}
}
</integer></integer>
 


这段代码与原文没多大差别,仅记录自己的学习过程

代码解析:

   一定要注意,调用Math.max(a,b);Math.min(a,b)比较大小时,初值为:

int xMax=Integer.MIN_VALUE;
int yMax=Integer.MIN_VALUE;
int xMin=Integer.MAX_VALUE;
int yMin=Integer.MAX_VALUE;



这样,才能得到正确的比较结果,不要搞反了

归纳总结:
    对java内置的一些函数要熟悉,只要不是写算法,必要时可直接调用

后面的会依次整理,督促自己,好好复习,奋斗!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息