美团编程题AC JAVA版本

第一题找是K的倍数的最长子序列
sum[i]记录序列从0到i的和
问题转化为sum[]数组中两个元素差是k的倍数,两元素下标的最大差值
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int[] p = new int[n];
            int[] sum = new int[n + 1];
            sum[0] = 0;
            for (int i = 0; i < n; i++) {
                p[i] = sc.nextInt();
                sum[i + 1] = sum[i] + p[i];
            }
            int k = sc.nextInt();
            int res = 0;
            for (int i = 0; i < n; i++) {
                for (int j = n; j > i; j--) {
                    if (getLength(sum, i, j, k) > res) {
                        res = getLength(sum, i, j, k);
                        break;
                    }
                }
                if (res >= n - i) {
                    break;
                }
            }
            System.out.println(res);
        }
        sc.close();
    }
    static int getLength(int[] sum, int begin, int end, int k) {
        int res = 0;
        if ((sum[end] - sum[begin]) % k == 0) {
            res = end - begin;
        }
        return res;
    }

第二题改卷子
只要最大数小于等于和的二分之一就行
public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int n = sc.nextInt();
			int[] s = new int[n];
			int sum = 0;
			for (int i = 0; i < n; i++) {
				s[i] = sc.nextInt();
				sum += s[i];
			}
			Arrays.sort(s);
			if (sum >= 2 * s[n - 1]) {
				System.out.println("Yes");
			} else {
				System.out.println("No");
			}
		}
		sc.close();
	}
PS:前面的选择题有点炸

全部评论
你咋这么能呢 你咋不上天呢 你选择题做出来了么
点赞 回复 分享
发布于 2017-08-31 21:26
第一题有没有办法动态规划啊?实在想不出动态规划该怎么弄T^T
点赞 回复 分享
发布于 2017-09-01 18:40
改卷子,你写的sc.close有意义吗?好像while循环都出不来
点赞 回复 分享
发布于 2017-09-01 11:27
import java.util.Scanner; /** * Created by fishsey on 2017/8/31. */ public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); int n,temp; while (cin.hasNext()) { n = Integer.parseInt(cin.nextLine()); int maxNum=0, sums=0; while (n-- > 0) { temp = cin.nextInt(); sums += temp; maxNum = Math.max(maxNum, temp); } cin.nextLine(); if (sums >= maxNum*2) System.out.println("Yes"); else System.out.println("No"); } } } 第二题0%,楼主看看哪里有问题???
点赞 回复 分享
发布于 2017-08-31 22:48
怎么想到第一题把sum转化成元素之差的呀,为啥我想不到。。。啊,好想哭啊,,,找不到工作了T_T
点赞 回复 分享
发布于 2017-08-31 22:45
#include<iostream> using namespace std; #define MAX 100 int fun(int* a,int length,int p=5) { int i,j,k; int time,sum=0; for(i=length;i>0;i--) { time=length-i+1; for(j=0;j<time;j++) { for(k=j;k<i+j;k++) sum=sum+a[k]; if(sum%p==0) return i; sum=0; } } return -1; } void main() { int a[MAX]; int N,i=0; while(cin>>N) a[i++]=N; cout<<fun(a,i)<<endl; }
点赞 回复 分享
发布于 2017-08-31 22:22
第一题基本思想和楼主一样。。。。。 import java.util.Scanner; public class meituan { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); int[] nums = new int[N]; for(int i = 0; i < N; i++){ nums[i] = in.nextInt(); } int K  = in.nextInt(); int step = 0; long[] dp = new long[N+1]; dp[0] = 0; dp[1] = nums[0]; int index = 1; for(int i = 2; i <=N; i++){ dp[i] = dp[i-1] + nums[index++]; } int max = 0; for(int i = 0; i <=N; i++){ for(int j = N; j>=i; j--){ if((dp[j] - dp[i])%K==0){ max = Math.max(max, j-i); } } } // for(int i = N-1; i>=0; i--){ // if(dp[i]%K==0){ // System.out.println(i+1); // break; // } // } System.out.println(max); } } 楼主看看哪里有问题
点赞 回复 分享
发布于 2017-08-31 21:47
吐槽。。。。第一题居然让n^2的水过。。。
点赞 回复 分享
发布于 2017-08-31 21:37
感觉要拼一波选择
点赞 回复 分享
发布于 2017-08-31 21:37
mark 膜拜            
点赞 回复 分享
发布于 2017-08-31 21:36
二题90很尴尬
点赞 回复 分享
发布于 2017-08-31 21:26

相关推荐

求offer的大角牛:简历写的第一乱,没有突出重点,第二项目太多太杂看不出来有啥核心技术,第三自我评价太多了,第四获得的荣誉没啥含金量,可以不写,反正问题不少
点赞 评论 收藏
分享
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-25 18:02
来组里2个月了,天天让打杂,写的代码不超过200行。现在已经开始摆烂冲秋招了。我感觉4个月,就算周六日全天睡觉,周一到周五一直看黑马也比我来节子实习学到的东西多。
小熊梦奇:😅节子那么多文档,你是一个都不看啊。 大厂的意义在于内部系统对你开放,看明白事情起因经过结果解决措施,实在看不明白,直接聊天系统搜到对应团队去问当时的负责人,大部分情况下都会给你解答。 这才是大厂实习的精髓
实习生的蛐蛐区
点赞 评论 收藏
分享
评论
点赞
20
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务