java华为机试_华为机试笔记

2016.8.3

Paste_Image.png

import java.util.Scanner;

public class test {

public static void main(String args[]){

Scanner in = new Scanner(System.in);

int n = in.nextInt();

int result=0;

int[] a = new int[n];

int sum =0;

for(int i= 0; i

a[i]= in.nextInt();

}

if(n==1)

{

result=a[0];

}

while(n>1)

{

int index=findmin(a,n);

if(index==n-1){

result+=a[index]+a[0];

a[0]=a[index]+a[0];

}

else{

result+=a[index]+a[index+1];

//数组向前删除index+1这个元素

a[index]=a[index]+a[index+1];

for(int i=index+2;i

{

a[i-1]=a[i];

}

}

n--;

}

System.out.print(result);

}

//坐标加后面值最小,就返回最小值

public static int findmin(int a[],int n)

{

int temp=a[n-1]+a[0],index=n-1;

for(int i=0;i

{

if((a[i]+a[i+1])

temp=a[i]+a[i+1];

index=i;}

}

if(a[n-1]+a[0]

{

temp=a[0]+a[n-1];

index=n-1;}

return index;

}

}

踩过的坑

要找队列中最大值,那么最开始的temp就要赋为一个特别大的值,如果temp=0,然后找又比这个小的,就替换,根本替换不到好吗;temp初始化时谁的值,index也要改为对应的,要不然temp不被替换,返回的应该也是对的index。

这是循环队列,因此最后一个元素要特殊处理。不同的地方有:删除时,不需要后面元素移动,直接n--就行,还有,尾部的下个元素不是i+1,而是0;其他的是一样的,别忘记了,一样要把两个元素求和赋值给前一个元素。还有很特殊的情况,如果只有1个元素的话要特殊处理。

上面的代码属于中规中矩型,也可以用动态规划这种高大上的代码,参考

其他人的代码

Paste_Image.png

public class test {

public static void main(String args[]){

Scanner in = new Scanner(System.in);

String s = in.nextLine();

int count =0;

String result="";

String []strs=strs=s.split(" ");

for(int i=0;i

int num=Integer.valueOf(strs[i]);

strs[i]=Integer.toBinaryString(num);

if(strs[i].length()<3)

{

result=result+0+" ";

}

else if (strs[i].length()==3) {

result=result+0+" ";

}else

result=result+strs[i].subSequence(strs[i].length()-3, strs[i].length()-2)+" ";

}

System.out.printf(result.substring(0, result.length()-1));

}

}

踩的坑

● 输入一行数字,空格分开,但是没有指定数字个数

Scanner in = new Scanner(System.in);

String s = in.nextLine();

String []strs=strs=s.split(" ");

● 字符串截取函数subsequence(字符起始位值,终止位置)不包含终止位置

● 整形数值十进制、二进制之间转换

java进制转换。java中进行二进制,八进制,十六进制,十进制间进行相互转换

十进制转成十六进制:

Integer.toHexString(int i)

十进制转成八进制

Integer.toOctalString(int i)

十进制转成二进制

Integer.toBinaryString(int i)

十六进制转成十进制

Integer.valueOf("FFFF",16).toString()

八进制转成十进制

Integer.valueOf("876",8).toString()

二进制转十进制

Integer.valueOf("0101",2).toString()

或者利用位运算

initpintu_副本.jpg

没写

2016.8.10

找零

package datapreprocess;

import java.util.Scanner;

public class findMoney {

/**

* @param args

*/

static int [] money=new int[7];

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner in=new Scanner(System.in);

int a;

//java初始化一个数组

money[0]=1;

money[1]=2;

money[2]=5;

money[3]=10;

money[4]=20;

money[5]=50;

money[6]=100;

while(( a=in.nextInt())!=0)

{

for(int i=6;i>=0;i--)

{

if(money[i]<=a)

{

int result=changemoney(a,i);

System.out.println(result);

break;}//if

}//for

}//while

}

static public int changemoney(int a,int i)

{

if(i==0||a==1)

{

return 1;

}

else if(i<0||a<0){

return 0;

}

else {

return changemoney(a-money[i], i)+changemoney(a, i-1);

}

}

}

踩的坑:1.把问题想请,想就去做,递归实现时注意结束条件2.java初始化一个数组的方法,不能在声明的时候就赋值吗?

大数求和

package datapreprocess;

import java.util.Scanner;

public class BigdataSum{

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner in=new Scanner(System.in);

//java初始化一个数组

String a=new String();

String b=new String();

a=in.nextLine();

b=in.nextLine();

int length=a.length()>b.length()?a.length():b.length();

int[] a1=new int[length+1];

int[] b1=new int[length+1];

int[] result=new int[length+1];

int[] jw=new int[100];

for(int i=a.length()-1;i>=0;i--)

{

a1[a.length()-1-i]=a.charAt(i)-48;

}

a1[a.length()]=0;

for(int i=b.length()-1;i>=0;i--)

{

b1[b.length()-1-i]=b.charAt(i)-48;;

}

b1[b.length()]=0;

jw[0]=0;

for(int i=0;i

{

int c=a1[i]+b1[i]+jw[i];

jw[i+1]=c/10;

result[i]=c%10;

}//while

int i;

if(result[length]==0)

i=length-1;

else

i=length;

for(;i>=0;i--)

{

System.out.print(result[i]);

}

}

}

踩的坑:1)初始化两个整形数组的时候,要按最长的数组长度来初始化,并且还得+1,这样,就算一长一短的话也得有的加,就算最高位进位了,也有得加。2)在输出时注意,如果最高位是0 的话,就代表没有进位,可以不用输出,2)直接把一个字符型的数赋值给整形,是把ASCII码给整形的,所以还要再减48.

还可以用java中自带的BigInteger类型

while (in.hasNext())

{

a=in.nextBigInteger();

b=in.nextBigInteger();

System.out.print(a.add(b));

}

火车进站

8.16

Paste_Image.png

{

public static void main(String args[]){

Scanner in = new Scanner(System.in);

String a=in.nextLine();

char[] strs=new char [a.length()];

strs=a.toCharArray();

char front=strs[0];

int count=1;

for(int i=1;i

{

if(strs[i]>='A'&&strs[i]<='Z')

{

if(front==strs[i])

count++;

else {

System.out.print(front+""+count);

front=strs[i];

count=1;

}

}

else {

continue;

}

}

System.out.print(front+""+count);

}

}

判断一个字符是字母,用a>='A'&&a<='Z';在输出的时候,一个字符加一个数字会被变成ASCII码相加。

import java.util.Scanner;

public class Test2 {

public static void main(String[] args)

{

Scanner in=new Scanner(System.in);

String a=new String();

for(int i=0;i<3;i++)

{

for(int j=0;j<3;j++)

{ int k=in.nextInt();

if(i>j)

a+=k;

else

a+="0";

}

}

System.out.print(a);

}

}

坑:不一定要写成要求的函数体,只要输出正确即可。千万别条件判断再输入,先输入在条件判断

Paste_Image.png

Paste_Image.png

几种常见的输入输出方式

多行输入的话,每行只有一个数字。hasnext()判断是否有下一个元素;hasNextInt()判断是否有数字。

多行输入,每行有一组数字。

大整数 BigInteger,BigDecimal。

输出:

System.out.printf("格式",i);格式有:"输出一个浮点数:%+9.2f(输出长度为9.带2位小数),一个整数:%d,%x(16进制),%o(8进制),一个字符串:%s"。

将字符串转换成字符数组,String st = "abcdefg";char[] ch;ch = st.toCharArray();

你可能感兴趣的:(java华为机试)