当前位置: 首页 > 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.gsyq.cn/news/1409491.html

相关文章:

  • 基于可靠性的直接Turbo译码器RCODD的FPGA实现与优化
  • 2026年零基础适配!新手友好型AI自动化测试工具测评
  • 技术笔记 | 解析SQR-PR300管道机器人
  • ChatGPT驱动的客户旅程地图重构:从模糊感知到精准预测的7步落地框架
  • 天龙八部单机版GM工具终极指南:5分钟快速掌握游戏数据管理
  • 2026 AR 巡检标杆实录
  • ANSYS Workbench螺栓连接仿真避坑指南:从Beam连接到预紧力锁死,一个案例讲透
  • 从CentOS 8.5 Minimal到开发环境:安装后必做的10件事(配置yum源、SSH、防火墙)
  • 观察使用Taotoken的Token Plan套餐后月度账单的变化
  • 多级重叠Schwarz预处理技术在CFD中的应用与优化
  • 基于 HarmonyOS 6.0 的日程备忘应用页面构建:深色主题与数据看板设计详解
  • ManySpeech-CLI:开箱即用的本地命令行语音识别工具
  • Linux内核开发者视角:深入SMMUv3驱动,手把手拆解dma_map_sg()的IOVA连续映射魔法
  • 力扣HOT100(35)回溯-全排列
  • 国产第一!Qwen3.7-Max全端上线,好易智算同步首发,企业级Agent底座再添新选择
  • 阿姆智创IBOX-6076R工控一体机,机器视觉设备控制升级
  • Windows命令行利器:Hexdump十六进制文件解析实战
  • 为什么92.3%的人用错ChatGPT设目标?——斯坦福HAI实验室联合实证:3类错误输入导致目标漂移率提升4.8倍
  • AI应用可观测性工程2026:LLM调用追踪评估与监控全栈实践
  • 睡眠呼吸暂停监测:轻量化CNN与ECG信号分析
  • 跨越十个数量级的能效革命:从GPU到忆阻器,神经计算硬件的能耗全景与路径选择
  • 别再死记硬背梯度下降公式了!用Python动画可视化梯度流,理解优化算法的本质
  • 基于 HarmonyOS 6.0 的日程备忘应用:待办事项板与提醒卡片详解
  • 美股盘前盘后数据接入前的 4 项核验:交易窗口、返回样本、timestamp 与失败分支
  • Cortex-M3开发者文档版本更新解析与应对策略
  • 从顺序表到ArrayList,吃透动态数组的底层逻辑
  • 工业视觉辅助系统:实时检测与装配质量优化
  • 作为Oracle DBA,如何快速处理HANG类故障?
  • 【企业级ChatGPT客服话术安全白皮书】:工信部备案要求下的12类高危话术自动拦截规则(含正则+语义双引擎配置)
  • 研究生读文献亲测好用的工具