美团笔试被7整除 O(n)算法
发布于 2017-09-14 21:37 2910 次浏览 0 赞 来自 试题交流  

最后一个地方写出来了bug。。调对之后时间就到了。。忧伤。。不知道是按最高分计还是最后的一次成绩计= =要是后者的话就坑爹了尼玛。。

def count_bits(n):
    cnt = 0
    while n > 0:
        cnt += 1
        n /= 10
    return cnt

if __name__ == '__main__':
    n = int(raw_input().strip())
    data = raw_input().strip().split()
    a = [int(i) for i in data]
    bits = [1] * n
    mods = [0] * n
    left = [0] * 7
    
    #第一遍循环记录mod 7 为0, 1, 2, ..., 6的分别有多少个
    for i in xrange(n):
        bits[i] = (10 ** count_bits(a[i])) % 7
        mods[i] = a[i] % 7
        left[mods[i]] += 1
    
    #第二遍循环直接找出结果,和自己mod相同的话减一
    res = 0
    for i in xrange(n):
        for j in xrange(7):
            if (j * bits[i] + mods[i]) % 7 == 0:
                res += left[j] 
                if j == mods[i]:
                    res -= 1  
    print res


7 条回复

看到考试说明是计最后一次分数

摊手~

第一次见到这样令人无语的OJ呢~!

2017-09-14 21:41
小码快跑 回复 coder_23ZBTRDS

成绩是计最后一次的,但之前的提交都会记录

2017-09-14 21:42

最后手抖交了个0%,无法可说

2017-09-14 21:50

求思路..

2017-09-14 22:02
coder_23ZBTRDS 回复 coder_K5CRWHMA

无fuck说加一。。

2017-09-14 22:05
coder_23ZBTRDS 回复 coder_8AH8V4J5

count_bits计算每个数字有多少位(10进制),第一遍循环查找每个数字(假设为数字a,十进制有n位)mod7结果(mods数组)和10^n mod7的结果(bits数组),同时记录除以7余数分别为0,1,2,…,6的数字有多少个(left数组),第二遍循环对于每个数字,它前面放的数字可以被7整除的充要条件是,前面的数字mod7的结果,乘以这个数字的10^n mod7的结果,加上这个数字本身mod7的结果可以被7整除。那么只需遍历left数组就可以,如果遇到前面数字mod7 的结果与自己mod7的结果相同,那么结果减一

2017-09-15 13:09 1
根据题主的思路,O(n) Java 写法
/**
 * 除 7,O(n)算法
 */
import java.util.Scanner;

public class Main3 {
	
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		
		while(cin.hasNext()){
			int n = cin.nextInt();
			int[] a = new int[n];
			int[] len = new int[n];
			int[] count = new int[7];
			//记录每个数mod 7 为0, 1, 2, ..., 6的分别有多少个
			for(int i=0;i<n;i++){
				long temp =cin.nextLong();
				a[i] = (int) (temp % 7);
				len[i] = String.valueOf(temp).length();
				count[a[i]] += 1;
			}
			
			int result = 0;
			//因为a[i] 肯定为0,..6中的一个,而计算是否被7整除,需要a[i],这里直接用j代替,就相当于遍历包含了当前
			//元素的所有数(mod7),j中必有一个人等于a[i],所有减去自身(很巧妙)
			for(int i=0;i<n;i++){
				for(int j=0;j<7;j++){
					long temp = (long) (j*Math.pow(10, len[i])%7+a[i]);
					if (temp%7 == 0) {
						result += count[j];
						if (j == a[i]) {  //除去mod7 等于j(j中必有一数为a[i])
							result -= 1;
						}
					}
				}
			}
			System.out.println(result);
		}
	}
}


2017-09-15 14:22
添加回复
回到顶部