字节场景算法(Java实现)

<一>小明上学:

1.题目描述:小明总是睡过头,所以他定了很多用钟,只有在闹钟响的时候他才会醒过来并且决定起不起床从他起床算起他需要X分钟到达教室,上课时间为当天的A时B分,请问他最晚可以什么时间起床?

输入描述:
  每个输入包含一个测试用例
  每个测试用例的第一行包含一个正整数,表示闹钟的数量N(N<=100)
  接下来的N行每行包含两个整数,表示这个闹钟响起的时间为H1(0<=A<24)时Mi(0<=B<60)分
  接下来的-行包含一个整数, 表示从起床算起他需要X(0<=X<=100)分钟到达教室
 

  接下来的一行包含两个整数,表示上课时间为A(0<-A<24)时B(0<=B<60)分
  数据保证至少有一个闹钟可以让牛牛及时到达教室

输出描述:
  输出两个整数表示牛牛最晚起床时间

样例输入:

3

5 0
6 0

7 0

59

6 59

样例输出:

6 0

代码如下:

package com.ymm.core.zijie;

import java.util.Scanner;

public class Main2 {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int N = in.nextInt();  //闹钟的数目
            
            int[][] arr = new int[N][]; //闹钟响起的时间
            for(int i = 0;i < N;i++) {
            	arr[i][0] = in.nextInt();
            	arr[i][1] = in.nextInt();
            	
            }
            int X = in.nextInt();   //起床到达教室
            
            int hour = in.nextInt();
            int minHour = in.nextInt();
 
            int maxIndex = -1;
            for(int i = 0;i < N;i++) {
            	int temp = arr[i][1] + X;
            	int t = arr[i][0] + (int)(temp / 60);
            	int n = temp % 60;
            	
            	if(t < hour || (t == hour && n <= minHour)) {
            		if(maxIndex == -1) {
            			maxIndex = i;
            		}else if(arr[maxIndex][0] < arr[i][0] 
            				|| (arr[maxIndex][0] == arr[i][0] 
            						&& arr[maxIndex][0] < arr[i][0])){
            			maxIndex = i;
            		}
            	
            	}
            }
            if(maxIndex == -1) {
        		maxIndex = 0;
        	}
            
           System.out.println(arr[maxIndex][0] + " " +arr[maxIndex][1]);
        }
            
	}
}

<二>秘密通信

1.题目描述:小明和安琪是好朋友。最近,他们的谈话波家侦探机构监控,所以他们想将他们的谈话内容进行加密处理。于是,他们发明了一种新的加密方式。 每条信息都被编译成二进制数B(明文),其长度为N。然后该信息被写下K次,每次向右移动0,1.. K-1位。例如: B=1001010, K=4

1001010

1001010

1001010

然后对每列进行异或操作,并且把最终所得的结果记录下来,我们将该数称为S(密文)。例如上述例子的结果为:1110100110
最后,将编码的信息S和K发送给安琪。
小明已经实现了这种编码的加密过程,但他要求安琪写一个程序去实现这种编码的解密过程,你能帮助安琪实现解密过程吗?

输入描述:
第一行输入两个整数N和K
第二行输入一个二进制字符串s,长度是N+K-1

输出描述:
输出明文B

例1:
  输入:

    7 4

    1110100110

  输出:

    1001010

例2:

  输入:

    6 2

    1110001

  输出:

    101111

代码如下:

有点小问题,稍后完善1!

<三>万万没想到之抠门的老板:

1.题目描述
  我叫王大锤,是家互联网公司的老板。快到年底了,要给员工发奖金。真头疼,大环境这么差,怎么才能尽可能的少发点、同时还能让大家怨气少一点呢?公司的座位是排成一排的,每个人都最多打听的到和自己相邻左右两个人的奖金数。我决定这样发:

  (1).每个人都至少发100块。
  (2).论资排辈每个人加入公司的年限是公开的,如果个员工A加入公司的时间比邻座的同事8早,那A至少比B多拿100块。这样,他的心理会平衡一些。
  我特喵是个天才!将人性理解的如此透彻,做个小公司的老板真是屈才了。

  万万没想到,发完奖金,所有员工都离职了,都跳槽去了一家叫****的公司,他们都说这家公司一不论资排辈,二不吃大锅饭,奖惩分明,激励到位,老板还特别大方,说得我都想去应聘了

  请听题:给定大锤公司易工的座位表,以及每个员工的入职时问,计算大锤最少需要发多少奖金。

输入描述:
  第一行只有一个正整数N(1<=N<=1000)表示员工人数
  第二行有N个正整数,代表每个员工的入职年限。排列顺序即为员工的座位顺序。
输出描述:
  一个数字, 代表大锤最少需要发的奖金总数。
例1:

  输入:

    4

    3 9 2 7

  输出:

    600

  说明:每人奖金数为(100、200、100、200);

例2:

  输入:

    3

    1 1 1 

  输出:

    300

  说明:每人奖金为(100、100、100);

例3:

  输入:

    5

      1 2 3 4 5

  输出:

    1500

  说明:每人奖金数为(100、200、300、400、500);

代码如下:

package com.ymm.core.zijie;

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

public class Mian7 {

	public static final int MIN_MONEY = 100; 
	public static void main(String[] args) {
		 Scanner scanner = new Scanner(System.in); 
	        int n = scanner.nextInt(); 
	        // 年份对应的座位号 
	        TreeMap<Integer, List<Integer>> map = new TreeMap<>(); 
	        int[] people = new int[n]; 
	        for (int i = 0; i < n; i++) { 
	            people[i] = scanner.nextInt(); 
	            if (!map.containsKey(people[i])) { 
	                map.put(people[i], new ArrayList<>()); 
	            } 
	            map.get(people[i]).add(i); 
	        } 
	        int[] money = new int[n]; 
	        int[] tmp = new int[n]; 
	        while (!map.isEmpty()) { 
	            int lowestKey = map.firstKey(); 
	            for (int i : map.get(lowestKey)) { 
	                if (i == 0) { 
	                    tmp[i] = money[i + 1] + 100; 
	                } else if (i == n - 1) { 
	                    tmp[i] = money[i - 1] + 100; 
	                } else { 
	                    tmp[i] = Math.max(money[i - 1], money[i + 1]) + 100; 
	                } 
	            } 
	            for (int i : map.get(lowestKey)) { 
	                money[i] = tmp[i]; 
	            } 
	            map.remove(lowestKey); 
	        } 
	        int sum = 0; 
	        for (int i : money) { 
	            sum += i; 
	        } 
	        System.out.println(sum); 
	}

}

 这个题还有最简单的方法:

申请两个数组,都初始化100.

  从左往右遍历一遍,若前一个数比后一个数大,则前一个数加100,小则不管,把这组数据放在数组中。

  从右往左再遍历一遍,若前一个数比后一个小,则前一个加100,小则不变,把这组数放在另一个数组中。

  最后,两个数组各个位子取大的,把这个大的数组就是需要的结果!

代码如下:

package com.ymm.core.zijie;

import java.util.Scanner;

public class Main8 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
 
        int[] arr = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = scanner.nextInt();
        }
 
        int[] arr1 = new int[N];
        int[] arr2 = new int[N];
        for (int i = 0; i < N; i++) {
            arr1[i] = 100;
            arr2[i] = 100;
        }
        int base = 100;
        for (int i = 1; i < N; i++) {
            if (arr[i] > arr[i - 1]) {
                arr1[i] += base;
                base += 100;
            }
        }
        base = 100;
        for (int i = N - 1; i > 0; i--) {
            if (arr[i - 1] > arr[i]) {
                arr2[i - 1] += base;
                base += 100;
            }
        }
        int sum = 0;
        for (int i = 0; i < N; i++) {
            sum += arr1[i] > arr2[i] ? arr1[i] : arr2[i];
        }
        System.out.println(sum);
	}

}
原文地址:https://www.cnblogs.com/youdiaodaxue16/p/11343374.html