2019秋季校招笔试题记录中...

拼多多 最大乘积

题意:从数字数组中选择三个数,使其乘积结果最大。
约束:时间复杂度O(n) 空间复杂度O(1)
解题:三个数的最大乘积为最大的三个数,或者最小的两个负数及最大正数的乘积。所以找到这五个数就好

# python3 30ms 4088K
n = int(input())
ary = [_ for _ in map(int, input().strip('\n').split())]
v = [0] * 5
for val in ary:
    if val >= v[2]:
        val, v[2] = v[2], val
        if v[2] >= v[3]:
            v[2], v[3] = v[3], v[2]
            if v[3] >= v[4]:
                v[3], v[4] = v[4], v[3]
    if val <= v[1]:
        val, v[1] = v[1], val
        if v[1] <= v[0]:
            v[1], v[0] = v[0], v[1]
print(max(v[0] * v[1] * v[4], v[2] * v[3] * v[4]))

大整数相乘

两个大数相乘,手写10000进制,或者利用傅里叶变换

#include <cstdio>
#include <cstring>
const int N = 1010, BASE = 10000;
char a[N], b[N];
int bit[N >> 1], eax[N >> 1], res[N >> 1];
void add(int EAX[], int len, int phase) {
	for (int i = phase, j = 0; j < len; ++j, ++i) {
		res[i] += EAX[j];
		if (res[i] >= BASE) {
			res[i] -= BASE;
			res[i + 1]++;
		}
	}
}
int main()
{
	for (int i = 0; i < 4; ++i) a[i] = b[i] = '0';
	while (~scanf("%s%s", a + 4, b + 4)) {
		memset(bit, 0, sizeof bit);
		memset(res, 0, sizeof res);
		int len_a = strlen(a), len_b = strlen(b), i, len = 0, phase = 0;
		int guard = len_a % 4; if (guard == 0) guard = 4;
		for (i = len_a - 1; i > guard; i -= 4) {
			for (int j = 0, k = i - 3; j < 4; ++j, ++k)
				bit[len] = bit[len] * 10 + a[k] - '0';
			len++;
		}
		guard = len_b % 4; if (guard == 0) guard = 4;
		for (i = len_b - 1; i > guard; i -= 4, ++phase) { //phase 相位移
			int num = 0, c = 0, j;
			for (int j = 0, k = i - 3; j < 4; ++j, ++k) {
				num = num * 10 + b[k] - '0';
			}
			for (j = 0; j < len; ++j) {
				eax[j] = bit[j] * num + c; c = 0;
				if (eax[j] >= BASE) {
					c = eax[j] / BASE;
					eax[j] %= BASE;
				}
			}
			if (c) eax[j++] = c;
			add(eax, j, phase); // res += eax;
		}
		i = (len_a + len_b - 8 >> 2) + ((len_a + len_b - 8) % 4 > 0);
		while (i > 1 && res[i - 1] == 0) --i;
		printf("%d", res[--i]);
		while (i-- > 0) printf("%04d", res[i]);
		puts("");
	}	
	return 0;
}

变态跳台阶 斐波那契 动态规划

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
f n = ∑ i = [ 0 , n ) f i f_n=\sum_{i=[0,n)}f_i fn=i=[0,n)fi

public class Solution {
   public int JumpFloorII(int target) {
       int[] dp = new int[target + 1];
       dp[0] = dp[1] = 1;
       for (int i = 2; i <= target; ++i) {
           dp[i] = 0;
           for (int j = 0; j < i; ++j) {
               dp[i] += dp[j];
           }
       }
       return dp[target];
   }
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值