360内推在线笔试算法题

4 篇文章 0 订阅

算法题有两个。

第一个:有多个输入字符串,求每个字符串的第一次出现的字符。

建立一个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
1 2
3 2
输出:不能选出镇长返回0,在输出空行。
      选出镇长先给出镇长数目,其次是镇长人选
输出:
0

1
这个题没有做出来,但思路是创建<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);;
				}
			}
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值