华为上机题整理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代码:
代码解析:
一定要注意,题目是“超长整数”,意味着读入的是字符串,而不是整数,所以,不能用下面的代码来读取键盘输入,
否则会报错误:
当然,一般整数的输入,这样读取ok
归纳总结:
初看题目,第一反应是可以用“大数值”来做,直接调用
觉得很easy,但别忘了,人家叫你用算法实现。考的还是字符串类的基础知识!
2.城市电话号码
java代码:
代码解析:
一定要注意,在第一步对所有位数的判断,是所有3个中有一个位数不正确,都判定为非法,但第一个允许两种情况(0或3),这时就需要()把第一个与其他两个区别开来,不然,得不到正确的判定 结果。
再者,在写判定条件时:
与
有相当大差别,在逻辑上也是不对的。
归纳总结:
操作字符串的基础知识,注意抓题眼,同时,测试用例要多试试题目没给出来的。
3.最小长方形
java代码:
这段代码与原文没多大差别,仅记录自己的学习过程
代码解析:
一定要注意,调用Math.max(a,b);Math.min(a,b)比较大小时,初值为:
这样,才能得到正确的比较结果,不要搞反了
归纳总结:
对java内置的一些函数要熟悉,只要不是写算法,必要时可直接调用
后面的会依次整理,督促自己,好好复习,奋斗!!!!
本文是在原有代码上改进,所以,首先要感谢原作者,原文链接
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内置的一些函数要熟悉,只要不是写算法,必要时可直接调用
后面的会依次整理,督促自己,好好复习,奋斗!!!!
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树