2016年华为校园招聘编程题

第一题:

      有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。

输入描述:

每组数据为一行一个整数n(小于等于1000),为数组成员数,如果大于1000,则对a[999]进行计算。

输出描述:

一行输出最后一个被删掉的数的原始下标位置。

示例:

8

解析:这是一个典型的约瑟夫环问题 

import java.util.LinkedList;
import java.util.Scanner;

public class Circle {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int num = scanner.nextInt();
			LinkedList<Integer> list = new LinkedList<>();
			for (int i = 0; i < num; i++)
				list.add(i);
			int position = 0;
			int temp=0;
			while (list.size() > 1) {
				position += 2;
				if (position > list.size()-1)
					position = position % list.size();
				temp=list.indexOf(list.get(position));
				 list.remove(position);  //返回值是该对象,而不是该对象的索引
				 position=temp;
				//System.out.print(position);
				//System.out.println(list.toString());
			}
			System.out.println(list.get(0));
		}
	}

}

 

这道题我犯了一个错误,我以为list.remove()方法的返回值是被删除元素的下标,实际上返回的是被删除的元素。 

扫描二维码关注公众号,回复: 3415684 查看本文章

第二题:

     输入一个字符串,求出该字符串包含的字符集合

输入描述:

每组数据输入一个字符串,字符串最大长度为100,且只包含字母,不可能为空串,区分大小写。

输出描述:

每组数据一行,按字符串原有的字符顺序,输出字符集合,即重复出现并靠后的字母不输出。

示例:

abcqweracb

abcqwer

解析:这是一个字符串去重问题。如果是百度的面试题,可能还得考虑优化,减少复杂度;但这是华为的题,直接暴力解就行了。

import java.util.Scanner;
public class Second {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()){
			char[] s = scanner.nextLine().toCharArray(); //用字符数组存,方便取数
			String temp = "";
		    int length = s.length;
		    for(int i =0;i<length;i++){
		    	if(!temp.contains(s[i]+""))
		    		temp+=s[i];
		    }
		    System.out.println(temp);
		}
		
	}

}

或者也可以直接用字符串存取,在这其中使用到字符串截取函数substring();注意该方法的第二个参数不能超过字符串的长度。

import java.util.Scanner;

public class Second {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext()){
			String s = scanner.nextLine();
			String temp = "123";
		    int length = s.length();
		    for(int i =0;i<length;i++){
		    	if(!temp.contains(s.substring(i,i+1)))
		    		temp+=s.substring(i,i+1);
		    }
		    System.out.println(temp);
		}
		
	}

}

这道题写的时候我用错了一个字符串函数,就是indexOf(int ch )函数,注意,这个函数返回的是某个字符在字符串中的索引位置。

如果这道题是百度机试题,就要考虑优化了!

第三题:

数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。 

输入描述:

输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。

输出描述:

输出九行,每行九个空格隔开的数字,为解出的答案。

解析:华为的机试总会有一道题是难题。 

 

猜你喜欢

转载自blog.csdn.net/QiuGuoJing/article/details/82704235
今日推荐