科大讯飞2017秋招笔试编程题

题目描述:队友争吵

思路:

  感觉像是找规律题:因为最左的一个LL、最右的一个R永远不会被消去,所以我们需要做的就是最后一个L的位置减去第一个R的位置就是消去的人数。

代码实现:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String queue = sc.next();
		int lCount = 0, rCount = queue.length() - 1, count = 0;
		for (int i = 0; i < queue.length(); i++) {
			if (queue.charAt(i) == 'R')//找到第一个R
				break;
			lCount++;
		}
		for (int j = queue.length() - 1; j >= 0; j--) {
			if (queue.charAt(j) == 'L')//找到最后一个L
				break;
			rCount--;
		}
		System.out.println(lCount + " " + rCount);
		count = queue.length() - (rCount - lCount);
		if (count > queue.length())
			count = queue.length();
		System.out.println(count);
	}
}

  或者一行实现:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String queue = sc.next();
		int count = 0;
		count = queue.length() - (queue.lastIndexOf("L") - queue.indexOf("R"));
		System.out.println(count);
	}
}

题目描述:球赛

思路:

  整体来说,可能大家思路都比较清晰,麻烦的就是输入,然后对输入的拆分处理是关键。

  尤其注意最终排名的要求:首先按积分,积分相同按净胜球,再相同按进球数。所以在写排序函数的时候需要注意。

代码实现:

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeMap;

public class laoxu {
	class Team {
		String name;
		int grade;
		int realwin;
		int in;

		public Team(String name, int grade, int realwin, int in) {
			this.name = name;
			this.grade = grade;
			this.realwin = realwin;
			this.in = in;
		}

		public void setGrade(int grade) {
			this.grade = grade;
		}

		public void setRealwin(int realwin) {
			this.realwin = realwin;
		}

		public void setIn(int in) {
			this.in = in;
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		laoxu main = new laoxu();
		while (sc.hasNext()) {
			String ns = sc.nextLine();
			int n = Integer.valueOf(ns);
			Team[] win = new Team[n];// n支球队的名字
			TreeMap<String, Team> map = new TreeMap<>();
			for (int i = 0; i < n; i++) {
				String cname = sc.nextLine();
				Team team = main.new Team(cname, 0, 0, 0);
				map.put(cname, team);
			}
			int len = (n * (n - 1)) / 2;// 对所有的比赛结果进行处理
			for (int i = 0; i < len; i++) {
				// 以空格分为对战球队str[0]和比分str[1]分别进行处理
				// A-B 1:2
				String[] str = sc.nextLine().split(" ");
				String[] name = str[0].split("-");
				String cname1 = name[0];// A
				String cname2 = name[1];// B
				String[] grad = str[1].split(":");
				int c1 = Integer.valueOf(grad[0]);// 1
				int c2 = Integer.valueOf(grad[1]);// 2
				int c = c1 - c2;// 比分差距,用于计算净胜球
				int grade1 = 0;// 得分 3 1 0
				int realwin1 = 0;// 净胜球数
				int in1 = c1;// 进球数
				int grade2 = 0;
				int realwin2 = 0;
				int in2 = c2;
				if (c == 0) {// 平局
					grade1 = 1;
					grade2 = 1;
				}
				if (c > 0) {
					grade1 = 3;
					realwin1 = c;
				}
				if (c < 0) {
					grade2 = 3;
					realwin2 = c2 - c1;
				}
				//设置得分、净胜球数、进球数
				Team team = map.get(cname1);
				team.setGrade(team.grade + grade1);
				team.setIn(team.in + in1);
				team.setRealwin(team.realwin + realwin1);
				map.put(cname1, team);
				
				Team team2 = map.get(cname2);
				team2.setGrade(team2.grade + grade2);
				team2.setIn(team2.in + in2);
				team2.setRealwin(team2.realwin + realwin2);
				map.put(cname2, team2);
			}
			int i = 0;
			for (String key : map.keySet()) {
				win[i++] = map.get(key);
			}
			//自定义排序比较器。排序规则:
			//首先按照积分,其次净胜球,最后进球数
			Arrays.sort(win, new Comparator<Team>() {
				public int compare(Team o1, Team o2) {
					int grade = o2.grade - o1.grade;
					int realwin = o2.realwin - o1.realwin;
					int in = o2.in - o1.in;
					if (grade != 0)
						return grade;
					else if (realwin != 0)
						return realwin;
					else
						return in;
				}
			});
			String[] name = new String[n / 2];
			for (i = 0; i < n / 2; i++)
				name[i] = win[i].name;
			Arrays.sort(name);//对球队名字按字典序输出
			for (i = 0; i < n / 2; i++)
				System.out.println(name[i]);
		}
	}
}

题目描述:课程冲突

思路:

  很简单,利用map的键值对特性,键存储时间信息,值存储对应时间的课程信息;因为考虑到同一时间可能有多门课程(即冲突)的情况,所以值用ArrayList来存储。

  处理完后,遍历map,找出相应时间的list的大小(也就是同一时间有几门课),如果大于1,说明有冲突;如果都没有,则输出“YES”。

  但要注意题目要求按时间顺序输出,所以就需要使用TreeMap了。

代码实现:

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

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Map<String, List<String>> map = new TreeMap<String, List<String>>();
		int n = sc.nextInt();
		for (int i = 0; i < n; i++) {
			String time = sc.next(), code = sc.next();
			if (!map.containsKey(time))
				map.put(time, new ArrayList<String>());
			map.get(time).add(code);
		}
		for (String time : map.keySet()) {
			if (map.get(time).size() > 1) {
				System.out.printf(time);
				for (String code : map.get(time))
					System.out.printf(" " + code);
				System.out.printf("\n");
			}
		}
	}
}

------至所有正在努力奋斗的程序猿们!加油!!
有码走遍天下 无码寸步难行
1024 - 梦想,永不止步!
爱编程 不爱Bug
爱加班 不爱黑眼圈
固执 但不偏执
疯狂 但不疯癫
生活里的菜鸟
工作中的大神
身怀宝藏,一心憧憬星辰大海
追求极致,目标始于高山之巅
一群怀揣好奇,梦想改变世界的孩子
一群追日逐浪,正在改变世界的极客
你们用最美的语言,诠释着科技的力量
你们用极速的创新,引领着时代的变迁

——乐于分享,共同进步,欢迎补充
——Any comments greatly appreciated
——诚心欢迎各位交流讨论!QQ:1138517609
——CSDN:https://blog.csdn.net/u011489043
——简书:https://www.jianshu.com/u/4968682d58d1
——GitHub:https://github.com/selfconzrr

你可能感兴趣的:(编程算法,编程题整理)