华为机试笔记

2016.8.3

华为机试笔记_第1张图片
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; i1)
    {
        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

}

踩过的坑

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

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

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

华为机试笔记_第2张图片
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

}

踩的坑

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

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()

或者利用位运算

华为机试笔记_第3张图片
initpintu_副本.jpg

没写

2016.8.10

华为机试笔记_第4张图片
找零

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初始化一个数组的方法,不能在声明的时候就赋值吗?

华为机试笔记_第5张图片
大数求和

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));
}

华为机试笔记_第6张图片
火车进站

8.16

华为机试笔记_第7张图片
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='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);
 }

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

华为机试笔记_第8张图片
华为机试笔记_第9张图片
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();

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