滴滴9.17笔试题复盘(差分数组和前缀和数组)

第一题:

输入一个字符串,字符串是有一系列数字和问号组成的。要求把问号的地方变成数字,输出这个数字最小是多少。对于这个数字的特征,主要有三点描述:

  • 相邻位置上的数字不相同
  • 没有前导0,即首位不能是0
  • 该数能被3整除

思路:

一个很直观的思路就是,我们遍历0-9,从小到大遍历,把不符合上述三点要求的排除掉,就是答案!

代码实现
bool finded; // 该bool值用来判断是否找到符合要求的答案
string ans; // 用来保存最后的结果
// first为指针,遍历字符串, value用来存储各个位之和,str为要递归的字符串
void dfs(int first, int value, string& str) { 
    if (finded) return; // 如果找到,则返回
    if (first == str.size()) { // 如果没找到,看指针是否走到末尾
        if (value % 3 == 0) { // 此时各个位上的数字之和能够被3整除
            finded = true;  // 则置finded为TRUE
            ans = str; // 保存结果
        }
        return;
    }
    if (str[first] != '?') { // 如果该位不是‘?’
        if (first > 0 && str[first] == str[first - 1]) return; // 如果此时后一位与前一位相同, 那么该数字不合法,直接返回
        dfs(first + 1, value + (str[first] - '0'), str); // 否则进行递归
    }
    else {
        for (char ch = '0'; ch <= '9'; ++ch) { // 如果是'?'
            if (first == 0 && ch == '0') continue; // 如果是第一个字符且遍历到'0',则跳过
            if (first > 1 && ch == str[first - 1]) continue;  // 如果和前一位相同,继续跳过
            str[first] = ch; // 让该位为遍历到的字符
            dfs(first + 1, value + str[first] - '0', str); // 进行递归
        }
    }
}
void solve() {
    string str; cin >>  str;
    if (str.size() == 1) { // 当字符串的长度为1时
        cout << 3 << endl; // 直接返回3
        return;
    }
    dfs(0, 0, str);
    cout << ans << endl;
}

至于滴滴笔试的第二个题,忘了具体题目考的什么了,然后从LeetCode上找了一个类似的题目来分享一下,顺便学一学差分数组和前缀和数组的这种思路方法:
图片1
首先这个题最直观的一个解法就是,我们可以遍历bookings这个数组,把各段预订的航班数加起来,那么就可以求出来最后的结果:

代码实现
class Solution {
public:
		vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
				vector<int> res(n); // 创建结果数组
				for (auto &b : bookings) { // 遍历bookings数组
						for (int i = b[0] - 1; i < b[1]; i++) {
								res[i] += b[2]; // 把每段的航班数加起来
						}
				}
				return res; // 返回结果
		}
};
时间复杂度:O(m * n)

这样做肯定会超时,那么还有什么方法可以进行优化呢?就是差分数组和前缀和数组。

  • 比如数组:{1, 2,3, 4}
  • 其差分数组就是:{1, 1, 1, 1}
  • 也就是原数组中的后一位减前一位的差值,其中第一位没有前一位,那么就是它本身。
  • 前缀和数组则是:{1,3, 6,10}
  • 即前n项和,第一位就是1,第二位就是1+2=3,第三位就是1+2+3=6,第四位就是1 + 2 +3 + 4 = 10。
  • 这个时候,如果我们给原数组中的第二位和第三位增加一个增量2,即原数组就变为:{1,2+2,3+2, 4} = {1, 4, 5, 4}
  • 那么新数组的差分数组则是:{1,3,1, -1} 我们发现相比于原来的差分数组,发生变化的就只是第二位和第四位,也就是第三位的后一位。
  • 因此,原来遍历求区间和的这个过程就可以转换为先求每个区间的差分数组,然后加起来,再求该差分数组的前缀和数组,即为最后结果!
代码实现:
class Solution {
public:
    vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
        vector<int> nums(n + 1); // 构建差分数组
        int left = 0, right = 0, inc = 0;
        // left为左边界,right为右边界,Inc为增量
        for (auto booking : bookings) {
            left = booking[0] - 1;
            right = booking[1] - 1;
            inc = booking[2];
            nums[left] += inc;
            nums[right + 1] -= inc;
        }
        vector<int> res(n); // 求差分数组的前缀和
        for (int i = 0; i < n; i++) {
            if (i == 0) {
                res[i] = nums[0];
            } else {
                res[i] = res[i - 1] + nums[i]; // 求前缀和数组的过程
            }
        }
        return res;
    }
};
时间复杂度:O(m + n)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Intel HD Graphics Family 9.17.10.4229是英特尔的一款图形处理器驱动程序版本号。该版本的驱动程序是用来控制Intel HD Graphics系列显卡运行的软件。这些显卡通常嵌入在英特尔的处理器中,用于处理图形和视频的显示。 该驱动版本9.17.10.4229可能是在2014年发布的,所以它可能已经过时。后续版本的驱动程序往往包含更多的优化和新的功能,以提升图形处理性能和兼容性。 驱动程序的更新可以通过访问英特尔官方网站来获取。更新驱动程序可能会解决一些已知的问题和错误,并提供更好的图形性能。同时,驱动程序的更新还可以支持新的技术和功能,例如更高的分辨率、更流畅的视频播放和新的游戏效果。 安装驱动程序的过程相对简单。用户可以下载最新版本的驱动程序,并按照提示进行安装。通常需要重启计算机以使驱动程序生效。在安装过程中,可能需要解压缩文件并运行安装程序。英特尔还提供了一些工具,用于检测当前显卡驱动程序的版本和进行驱动程序的自动更新。 在使用计算机时,出现一些图形相关问题,例如画面模糊、闪烁或黑屏等,可能与旧版本的显卡驱动程序有关。这时可以尝试更新驱动程序以解决问题。 总之,Intel HD Graphics Family 9.17.10.4229是一款旧版本的显卡驱动程序,建议用户升级到最新版本以获得更好的图形性能和兼容性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loveCC_orange

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值