华为2016校园招聘笔试题

      昨天刚参加华为的校园招聘笔试,总体来说是很容易的,一般人都可以吧前两道题做出来。下面我来分享一下题目吧:

1.从输入的字符串中找出元音字母:'a','o','e','i','u'。并且输出字符串中元音字母的种类,数量,与其他字符的数量。

输入样例:I love China

输出样例:5 5 7

  Ioeia

我的解答:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;

public class Main{
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		String str = s.nextLine();
		char []chs = str.toCharArray();
		List<Character> charList = new ArrayList<Character> ();
		Set<Character> charSet = new HashSet<Character>();
		for (int i = 0 ; i < chs.length; i ++) {
			if (contain(chs[i])) {
				charList.add(chs[i]);
				charSet.add(chs[i]);
			}
		}
		
		System.out.println(charSet.size() + " " + charList.size() 
				+ " " + (str.length() - charList.size()));
		for (Character c : charList)
			System.out.print(c);
	}

	private static boolean contain(char ch) {
		char [] chs = new char[]{'a','o','e','i','u','A','O','E','I','U'};
		for (int i = 0;i < 10 ;i ++) 
			if (ch == chs[i])
				return true;
		return false;
	}
}


2.找出输入字符串的最大值与次最大值,

输入要求:数字间以逗号隔开。

输出要求:1.如果输入数字为空,则最大值与次最大值均为0

2.如果只输入一个数字,则最大值与次最大值均为该数字

3.如果输入的数字大于等于2,并且都相等,则最大值与次最大值均为该数字

输入样例: 输出样例:

1,3,5,6 6,5

7 7,7

6,6,66,6

我的解答:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		String str = s.nextLine();
		String[] strs = null;
		if (str != null && !("").equals(str))
			strs = str.split(",");
		List<Integer> nums = deal(strs);
		int max = getMax(nums);
		int secondMax = getSecondMax(nums,max);
		System.out.println(max + "," + secondMax);
	}

	private static int getSecondMax(List<Integer> nums,Integer max) {
		if (nums.isEmpty() || nums.size() == 0)
			return 0;
		if (nums.size() == 1)
			return max;
		nums.remove(max);
		return getMax(nums);
	}

	private static int getMax(List<Integer> nums) {
		int index = 0;
		if (nums.isEmpty() || nums.size() == 0)
			return 0;
		for (int i = 0; i < nums.size();i ++)
			if (nums.get(index) < nums.get(i))
				index = i;
		return nums.get(index);
	}

	private static List<Integer> deal(String[] strs) {
		List<Integer> nums = new ArrayList<Integer>();
		if (strs != null) {
			for (int i = 0;i < strs.length;i ++)
				nums.add(Integer.parseInt(strs[i]));
		}
		return nums;
	}
}


3.计算两个矩形的交叉面积,给定两个矩形的左上角坐标与长和宽,计算交叉面积

输入一个以逗号分隔的字符串,共输入八个数字

第一第二个数字表示第一个矩形的左上角坐标(x,y),第三第四个数字表示第一个矩形长和宽

第五第六个数字表示第二个矩形的左上角坐标(x,y),第七第八个数字表示第二个矩形长和宽

样例输入:

1,2,2,1,2,4,3,1

  样例输出

  1

我的解答:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		String str = s.nextLine();
		String[] strs = str.split(",");
		Integer [] nums = new Integer[strs.length];
		for (int i = 0;i < nums.length; i ++)
			nums[i] = Integer.parseInt(strs[i]);
		int result = getSquare(nums);
		System.out.println(result);
	}

	private static int getSquare(Integer[] nums) {
		//如果有一个边长为0,则返回0
		if (nums[2] == 0 || nums[3] == 0
				|| nums[6] == 0 || nums[7] == 0)
			return 0;
		
		//获取第一个矩形所包含的所有点
		Point[][] pointArr1 = new Point[nums[2] + 1][nums[3] + 1];
		for (int i = 0;i < nums[2] + 1;i ++) {
			for (int j = 0;j < nums[3] + 1;j ++) {
				pointArr1[i][j] = new Point(nums[0] + i,nums[1] - j);
			}
		}
		
		//获取第二个矩形所包含的所有点
		Point[][] pointArr2 = new Point[nums[6] + 1][nums[7] + 1];
		for (int i = 0;i < nums[6] + 1;i ++) {
			for (int j = 0;j < nums[7] + 1;j ++) {
				pointArr2[i][j] = new Point(nums[4] + i,nums[5] - j);
			}
		}
		
		//获取交叉的点
		List<Point> pointList = getAllPoint(pointArr1, pointArr2);
		
		return getSquareByList(pointList);
	}

	private static int getSquareByList(List<Point> pointList) {
		if (pointList == null || pointList.isEmpty() 
				|| pointList.size() == 0)
			return 0;
		int maxX = 0, minX = 0, maxY = 0, minY = 0;
		for (int i = 0;i < pointList.size();i ++) {
			if (pointList.get(maxX).x < pointList.get(i).x)
				maxX = i;
			if (pointList.get(minX).x > pointList.get(i).x)
				minX = i;
			if (pointList.get(maxY).y < pointList.get(i).y)
				maxY = i;
			if (pointList.get(minY).y > pointList.get(i).y)
				minY = i;
		}
		return (pointList.get(maxX).x - pointList.get(minX).x)
				*(pointList.get(maxY).y - pointList.get(minY).y);
	}

	private static List<Point> getAllPoint(Point[][] pointArr1,
			Point[][] pointArr2) {
		List<Point> pointList = new ArrayList<Point>();
		for (int i = 0;i < pointArr1.length;i ++) {
			for (int j = 0;j < pointArr1[i].length;j ++) {
				for (int k = 0;k < pointArr2.length;k ++) {
					for (int m = 0;m < pointArr2[k].length;m ++) {
						if (pointArr1[i][j].equals(pointArr2[k][m]))
							pointList.add(pointArr1[i][j]);
					}
				}
			}
		}
		return pointList;
	}
}

class Point {
	public int x;
	public int y;
	
	public Point(int x,int y) {
		this.x = x;
		this.y = y;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Point other = (Point) obj;
		if (x != other.x)
			return false;
		if (y != other.y)
			return false;
		return true;
	}
	
}

        关注微信公众号每天学习一点程序员的职业经



  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值