算法题有两个。
第一个:有多个输入字符串,求每个字符串的第一次出现的字符。
建立一个256长度的hash表,统计每个字符出现的次数,再从字符串开始找次数等于
1的字符。
import java.util.*;
public class test {
public static char findFirstChar(String str){
if(str==null)
return ' ';
int[] arr=new int[256];
for(int i=0;i<str.length();i++)
arr[str.charAt(i)]++;
for(int i=0;i<str.length();i++){
if(arr[str.charAt(i)]==1)
return str.charAt(i);
}
return ' ';
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int num=in.nextInt();
while(in!=null&&num-->=0){
String str=in.nextLine();
System.out.println(findFirstChar(str));
}
}
}
第二个:
一个镇选镇长,a认识b,不代表b认识a;a认识b,b认识c,不代表a认识c。
所有人都认识的一个人,但这个人都不认识所有人的人当选镇长。默认每个人
认识自己。
输入:第一行是测试的组数。
随后第一个是镇上的人口总数,第二是认识关系数。
随后给出认识关系。
输入:
2
2 0
3 2
认识自己。
输入:第一行是测试的组数。
随后第一个是镇上的人口总数,第二是认识关系数。
随后给出认识关系。
输入:
2
2 0
3 2
1 2
3 2
输出:不能选出镇长返回0,在输出空行。
选出镇长先给出镇长数目,其次是镇长人选
输出:
0
1
2
3 2
输出:不能选出镇长返回0,在输出空行。
选出镇长先给出镇长数目,其次是镇长人选
输出:
0
1
2
这个题没有做出来,但思路是创建<Integer,List>的map,每个Integer后面的LIst
存放他认识的人。如果某个人所有人的List中都存在,而这个人的list中只有自己,
这个人就是要找的人。
错误的代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int num=in.nextInt();
while(in!=null&&num-->=0){
int numOfPerson=in.nextInt(),relations=in.nextInt();
if(relations==0){
System.out.println(0);
System.out.println();
continue;
}
HashMap<Integer,List<Integer>> map=new HashMap<Integer, List<Integer>>();
for(int i=1;i<=numOfPerson;i++){
List<Integer> t=new ArrayList<Integer>();
t.add(numOfPerson);
map.put(numOfPerson, t);
}
while(relations-->0){
int key=in.nextInt(),value=in.nextInt();
if(map.get(key)==null)
map.put(key,new ArrayList<Integer>());
map.get(key).add(value);
}
List<Integer> result=new ArrayList<Integer>();
for(int j=1;j<=numOfPerson;j++){
int count=0;
for(int i=1;i<=map.size();i++){
if(map.get(i).contains(j))
count++;
if(count==map.size()-1)
result.add(j);
}
}
System.out.println(result.size());
Iterator it=result.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
}
}
}
通过和同学讨论,得到一个目测是合格的解法。
设一个数组,遍历所有关系,被认识的人+1,认识的人-1,自己认识自己不算,
遍历完以后,扫描数组,数字等于总人数-1的,就是候选。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int num=in.nextInt();
while(in!=null&&num-->0){
int numOfPerson=in.nextInt(),relations=in.nextInt();
if(relations==0){
System.out.println(0);
System.out.println();
continue;
}
int[] arr=new int[numOfPerson+1];
while(relations-->0){
int key=in.nextInt(),value=in.nextInt();
if(key!=value){
arr[key]--;
arr[value]++;
}
}
for(int i=1;i<arr.length;i++){
if(arr[i]==numOfPerson-1){
System.out.println(1);
System.out.println(i);;
}
}
}
}
}