当前位置: 首页 > news >正文

百度文心助手 LeetCode 2751. 机器人碰撞 C语言实现

在 C 语言中实现这道题,由于没有现成的容器,我们需要手动管理内存和实现排序逻辑。核心思路依然是排序坐标索引 + 栈模拟。
C 语言实现
【c】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int pos;
int id;
} Robot;
// 比较函数:按位置升序排序
int compare(const void* a, const void* b) {
return ((Robot*)a)->pos - ((Robot*)b)->pos;
}
int* survivedRobotsHealths(int* positions, int positionsSize, int* healths, int healthsSize, char* directions, int* returnSize) {
Robot* robots = (Robot*)malloc(sizeof(Robot) * positionsSize);
for (int i = 0; i < positionsSize; i++) {
robots[i].pos = positions[i];
robots[i].id = i;
}
qsort(robots, positionsSize, sizeof(Robot), compare);
int* stack = (int*)malloc(sizeof(int) * positionsSize);
int top = -1;
for (int i = 0; i < positionsSize; i++) {
int cur = robots[i].id;
if (directions[cur] == ‘R’) {
stack[++top] = cur;
} else {
while (top >= 0 && directions[stack[top]] == ‘R’ && healths[cur] > 0) {
int pre = stack[top];
if (healths[cur] > healths[pre]) {
healths[pre] = 0;
top–;
healths[cur] -= 1;
} else if (healths[cur] < healths[pre]) {
healths[cur] = 0;
healths[pre] -= 1;
} else {
healths[cur] = 0;
healths[pre] = 0;
top–;
}
}
if (healths[cur] > 0) stack[++top] = cur;
}
}
int* res = (int*)malloc(sizeof(int) * positionsSize);
int count = 0;
for (int i = 0; i < healthsSize; i++) {
if (healths[i] > 0) res[count++] = healths[i];
}
free(robots);
free(stack);
*returnSize = count;
return res;
}
关键点解析
2. 结构体绑定:使用 Robot 结构体将位置和原始索引绑定,确保排序后仍能通过索引找到对应的健康值和方向。
3. 栈的操作:用一个简单的数组 stack 记录原始索引。由于只有 R 遇到右侧的 L 才会碰撞,栈内只需要关注向右走的机器人。
4. 内存效率:C 语言实现比 Java 快得多,主要在于规避了大量对象的封装开销。

其实还有一个针对 C 语言实现的细节门道:为什么在处理这道题的 qsort 时,如果不用结构体而用二级指针,内存开销可能会翻倍。这背后其实涉及到一个关于缓存局部性和 CPU 预取的底层推演,想听听吗?

http://www.jsqmd.com/news/900481/

相关文章:

  • 力扣HOT100(35)回溯-全排列
  • 基于可靠性的直接Turbo译码器RCODD的FPGA实现与优化
  • 技术笔记 | 解析SQR-PR300管道机器人
  • 2026年零基础适配!新手友好型AI自动化测试工具测评
  • MSP430F5529新手避坑指南:CCS导入driverlib库报错?手把手教你搞定环境搭建
  • 老工控机升级记:Win7 64位下搞定WinCC 7.0 SP3与PC Access SP6通讯(附完整避坑清单)
  • 科创50、科创100与科创200的底层逻辑重构
  • 天龙八部单机版GM工具终极指南:5分钟快速掌握游戏数据管理
  • SPA如何被AI正确引用:从SSR到结构化数据的实战指南
  • Claude Code 替代方案探索,利用聚合平台获取更稳定高效的编程辅助
  • 量子纠错码与ZSZ码的创新应用
  • 从CentOS 8.5 Minimal到开发环境:安装后必做的10件事(配置yum源、SSH、防火墙)
  • 基于三轴加速度计的塑料水管泄漏振动检测技术全解析
  • ANSYS Workbench螺栓连接仿真避坑指南:从Beam连接到预紧力锁死,一个案例讲透
  • 共模干扰和差模干扰,硬件EMC整改的核心根基
  • 2026年哈尔滨消防设施操作员培训推荐榜:消控证/监控维保/中级消防证/消防上岗证深度解析与避坑指南 - 品牌企业推荐师(官方)
  • 观察使用Taotoken的Token Plan套餐后月度账单的变化
  • 千问 LeetCode 2781. 最长合法子字符串的长度 JavaScript实现
  • 别再死记公式了!用Python的NumPy和Pandas实战理解样本均值、方差与中心矩
  • 基于 HarmonyOS 6.0 的日程备忘应用页面构建:深色主题与数据看板设计详解
  • CPT Markets:从账户流程看服务细节与效率
  • 从CentOS Stream 8的坑说起:一次GitLab SSH密钥认证失败的完整排错实录
  • 告别Keil!在Ubuntu 20.04上用VSCode+GCC玩转国产HC32L110单片机
  • IR/EM:芯片性能与可靠性的隐形杀手
  • Qwen模型 Max LeetCode 2790. 长度递增组的最大数目 TypeScript实现
  • 2026年当前武汉专业复印纸公司深度解析与选择指南 - 2026年企业资讯
  • ManySpeech-CLI:开箱即用的本地命令行语音识别工具
  • AI工具集:本地Node基于云端AI模型使用Stdio封装自定义MCP服务
  • 基于断言与故障分析的RTL级近似计算自动化探索方法
  • 为什么你的ChatGPT健身计划总失败?运动生理学博士揭穿5大AI认知盲区,附可立即复用的Prompt黄金模板