20190831 360机试

前几天面完了306,今天同学做了360正常批次的笔试,记录一下题目,报的是Java的后端,40个选择题包含很多内容,C++,数学,数据结构,Linux,设计模式,数据库各式各样。
两个编程题,第一题的比较简单,第二题有些难

第一题 寻找子串

大意就是给出一个字符串S,找出这个字符串的所有子串中出现次数最多的子串,输出踏出现的个数。

输入:
共一行,一个字符串s,仅有英文小写字母组成,s的长度不超过10000.

输出:
一个正整数,表示最大出现次数。

样例输入:
aba

样例输出:
2
提示:aba的所有子串为 a,b,a,ab,ba,aba,其中a出现的次数最多,出现了两次。

题目分析:
一开始感觉题目有些难,因为子串太多了,想用暴力实现去比较。但是后面突然想到最多的出现的子串,必然包含相同的字符,那么最小的子串其实就是一个字符,其实题目就可以理解成是一个字符串中单个字符的最多出现的次数。

代码实现:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String []args){
        Scanner in = new Scanner(System.in);
        String string = in.next();
        int count [] = new int [26];
        Arrays.fill(count,0);
        for(int i = 0;i<string.length();i++){
            count[string.charAt(i)-'a']++;
        }
        //find max
        int max = 0;
        for(int i =0;i<26;i++){
            if(max<count[i])
                max = count[i];
        }
        System.out.println(max);
    }
}

第二题:散步

小名每天都在一条笔直的路上散步,起点在路上某处,但是因为路上没有标识,他并不知道这个起点在路上的哪个位置,现在将道路分成N-1个等距的部分,你可以把这条路当做是一个数轴,道路上的结点标记为1-N,起点只可能这N个点中的一个。
但是小名还提供了一个重要信息,他每隔一段时间就会用手机看一下自己走了多远,记做D,但是他并不记得他是朝着哪个方向走的,唯一可以确定的是,在两次看手机的间隔中他不会改变方向,每次看完手机后他可能继续向前或者是回头走。
那么问题来了,已知他在散步过程中始终在1-N的范围内,那么符合上述条件的起点可能有多少个?

输入:
第一行两个正整数N M,N表示道路长度,M表示看手机的次数。(N,M <= 20000)
接下来M行,每行一个正整数D,表示小名朝着某个方向走了D个单位。(D <= 20000)

输出:
输出仅包含一个整数,表示可能的起点的数量。

样例输入:
10 3
5
2
6
样例输出:
8

题目分析:
只看单程的话,只有大于N/2时才有些出发点不能选,相反则所有的点都可以选,单程找出最大的一个数,可以根据这个数 2*(N-Max数)算出在当前情况下最先出发的话可以有多少个点可以选。
但是,前面的每一趟都会对后面的每一趟产生影响。我使用的递归,每个出发点都试着走一遍看能不能走通的。

不过最后同学没有来得及跑一下调试,我没想到更好的思路,不知道有没有别的方法。代码就不贴了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值