拼多多3.23笔试
1.简单的模拟。
2.求给定区间[L, R]范围内有多少个幸运数字。幸运数字是指该数字有任何的子串为3的倍数,包括0。比如8到13,有9,10,12,13四个幸运数字。
考虑到在计算一个数字是否幸运时,每位上的数字都等价于其mod 3。比如15445和12112在是否幸运上是等价的。
那么我现在只有0,1,2三种数字可能出现,而0本身又是3的倍数,所以如果一个数n>99了,那么n一定是幸运数字,因为在三个位置上,0,1,2怎么排都是幸运的。
所以建立一个大小为100的数组,保存i冲0到99,所有的幸运数字个数。这一步因为最多只有两位,所以分别判断个位和十位即可。
当LR区间与99相交时,从中寻找,若L>99,结果一定为R-L+1。
3.数组中,求每一个人后面能看到的人数,这个计数当到达末尾或者看到高度大于等于他本身的人时,会停下。
单调栈从左向右遍历,目的是找到每个元素后面第一个大于等于他本身的元素下标。所以栈应该保存元素下标,且是从栈底到栈顶单调递减的。栈顶top()的元素遇到大于他的nums[i]时,计算一下下标的差值dis存入ans,并不断弹出,每次都把dis存入ans,直到栈顶元素小于等于,或者栈空。
注意最后再对栈进行一遍操作,栈中此时的元素,代表这个位置的人能看到后面所有人。
本题注意用64位整型。size_t一步到位
4.字符串替换。
用set对数组X[i]去个重;
sort整个B字符串;
由小到大遍历set,把A串中(*it)-1的位置的字符,替换为B串中从头开始的字符。
整体上是贪心。
ak