飞书最后一轮笔试
1. n/1+n/2+n/3 +。。n/b; 牛客上的题目 浅尝辄止
int work(long long n, long long b) {
longlongans = 0;
long long left = 1;
long long right;
while(left <= b){
long long k = n / left;
right = n / k;
if(right>=b) ans+=(b-left+1)*k,break;
else ans += (right - left + 1) * k;
left = right + 1;
}
return(int)ans;
}
2. 求一个数组中 所有子数组中 非零数组的个数。( 非零子数组的意思就是,所有的子数组和都不为0.) 例如 -1, 1 , 1 不是非零子数组。 我的思路是求前缀和, 遍历每个子数组的起始位置和结束的位置。总的子数组个数为((n+1 )* n)/2假如当前区间为【i, j】,这段和为0. 那么以i开头, 其他的子数组都不是非零数组。 不知道为啥对了10%
3. 给出地图, 有一个法术的机会,将当前地图金币*-1.,给出地图中的金币 n*m。 从左侧出发,可以向右侧,右上,右下走。
求遍历地图中可获得的最多金币数,题目给出dp思路,先不使用法术 dp[i][j][0]=max( dp[i-1][j-1][0] , dp[i+1, j,0] dp[i, j , 0]) +ret[i][j].
然后在该点使用法术后的金币 dp[i, j, j] = max(max无法术(左,左上,左下)- ret[i][j] , max法术(左,左下,左上)+ret[i][j]);
欢迎讨论解法。
#笔试题目#