华为2019届校招笔试题

1.输入任意个字符串,将其中的小写字母变为大写,大写字母变为小写,其他字符不用处理

输入描述:abcd12#%XYZ

输出描述:ABCD12#%xyz

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String  string = in.nextLine();
		char[] ch = string.toCharArray();
		for(int i = 0; i < string.length(); i++) {
			if(ch[i] >= 'a' && ch[i] <= 'z') {
				ch[i] = (char)(ch[i]-'a'+'A');
			}
			if(ch[i] >= 'A' && ch[i] <= 'Z') {
				ch[i] = (char)(ch[i]-'A'+'a');
			}
		}
		System.out.println(new String(ch));
	}
}
asdj33&&%SI
asdj33&&%si

2.小偷来到了一个神秘的王宫,突然眼前一亮,发现5个宝贝,每个宝贝的价值都不一样,且重量也不一样,但是小偷的背包携带重量有限,所以他不得不在宝贝中做出选择,才能使偷盗的财富最大,请你帮助小偷计算一下。

输入描述:

  • 宝贝价值:6,3,5,4,6
  • 宝贝重量:2,2,6,5,4
  • 小偷背包容量:10

输出描述:

  • 偷到宝贝的总价值:15

示例1:

  • 输入:

                  6,3,5,4,6

                  2,2,6,5,4

                 10

  • 输出:15

分析:0-1背包问题

import java.util.Scanner;

public class Main {
	static int[] value = new int[1000];
	static int[] weight = new int[1000];
	static int[][] got = new int[1000][1000];
	static int len;
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
	    String v = in.nextLine();//价值
		String w = in.nextLine();//重量
		int cop = in.nextInt();//容量
		getValues(value, v);
		getValues(weight, w);
		System.out.println(getMax(0,cop));
		
		
		
	}
	//将字符串存入数组中
	static void getValues(int[] a, String s) {
		
		String[] array = s.split(",");
		len = array.length;
		for(int i=0; i < len; i++ ) {
			a[i] = array[i].charAt(0) - '0';
			
		}
		
	}
	
	//获取最大的价值
	static int getMax(int n, int c) {
		if(got[n][c] != 0) {
			return got[n][c];
		}
		if(n == len) {
			return 0;
		}
		if(weight[n] <= c) {
			return got[n][c] = Math.max(getMax(n+1, c),getMax(n+1, c-weight[n])+value[n]);
		}
		return got[n][c] = getMax(n+1, c);		
	}
	
	
}

可能这种更好理解一点:

package te;

import java.nio.file.spi.FileSystemProvider;

public class Main {
	static int[] value = new int[1000];
	static int[] weight = new int[1000];
	static int[][] got = new int[1000][1000];
	static int len;
	public static void main(String[] args) {
//		Scanner in = new Scanner(System.in);
	    String v = "6,3,5,4,6";//价值
//	    System.out.println(v);
	
		String w = "2,2,6,5,4";//重量
//	    System.out.println(w);
		int cop = 10;//容量
		getValues(value, v);	
		getValues(weight, w);
		
		System.out.println("获得最大价值:"+getMax(value, weight, len, cop, got));
		
		
		
	}
	//将字符串存入数组中
	static void getValues(int[] a, String s) {	
		String[] array = s.split(",");
		 len = array.length;
		 for(int i=0; i < len; i++ ) {
				a[i] = array[i].charAt(0) - '0';
				
			}
	
		
	}
	
	//获取最大的价值
	static int getMax(int[] v, int[] w, int n, int c,int[][] got) {//n表示物品的个数
		//采用从底到顶的方式来设置got[i][j]的值
		//首先放w[n-1]
		for(int j = 0; j <= c; j++) {
			if(j=0; i--) {
			for(int j=0;j<=c;j++) {
				if(jgot[i+1][j-w[i]]+v[i]?got[i+1][j]:got[i+1][j-w[i]]+v[i];
				}
			}
		}
	
		System.out.println("数组:");
		for(int i = 0;i < n; i++) {
			for(int j = 0;j <= c; j++) {
				System.out.printf("%-3d",got[i][j]);
				
			}
			System.out.println('\n');
		}
		return got[0][c];
					
	}
		
}

数组:
0  0  6  6  9  9  12 12 15 15 15 

0  0  3  3  6  6  9  9  9  10 11 

0  0  0  0  6  6  6  6  6  10 11 

0  0  0  0  6  6  6  6  6  10 10 

0  0  0  0  6  6  6  6  6  6  6  

获得最大价值:15

3.C++中的typedef好处很多,可以让标准化自己DIY的类型,为便于理解typedef能干啥,本题考查各种typedef后,某个自定义类型的最终形态是啥。

输入为两部分,共两行:

第一行是一堆typedef定义,标准C++语句,以分号结束,这里不用考虑struct/union这类,只需要考虑基本类型和指针。

第二行是指定某个自定义type

输出为该自定义type的最终形态

如输入:

typedef int INT;typedef INT** INTP;

INTP

则输出:int**

注意,如果有指针类型,则指针表达的*和前面的类型中级间隔一个空格,和编译器的输出保持一致;另外,如果第一行输入的语句是编译不过的,或者第二行选择的type在第一行中没有定义,则输出none

你可能感兴趣的:(笔试)