第一题:
有一个数组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
6
解析:这是一个典型的约瑟夫环问题
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()方法的返回值是被删除元素的下标,实际上返回的是被删除的元素。
第二题:
输入一个字符串,求出该字符串包含的字符集合
输入描述:
每组数据输入一个字符串,字符串最大长度为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的地方就是需要填充的。
输出描述:
输出九行,每行九个空格隔开的数字,为解出的答案。
解析:华为的机试总会有一道题是难题。