C/C++编程题集:华为面试题与解析

需积分: 3 2 下载量 25 浏览量 更新于2024-07-29 收藏 147KB DOC 举报
这篇资源主要包含了三道典型的C/C++面试题,涵盖了指针操作、位运算、字符串处理以及链表操作等核心知识点。下面分别对这些题目进行详细解析。 1. **指针与数组排序** 这道题要求编写一个函数`Func`,将包含0和非0整数的数组重新排列,使得0移到后面,非0整数移到前面,同时保持非0整数的有序性,并返回第一个0的下标。这涉及到指针操作和数组的遍历。设计思路可以是双指针法,一个指针从头开始遍历寻找0,另一个指针从尾部开始向前查找非0整数,然后交换它们。同时要注意处理边界情况和异常问题,确保不使用额外的辅助空间,提高效率。 2. **位运算计算1的个数** 这是一个常见的位运算题。`main`函数中的循环计算了给定整数`m`中二进制表示下的1的个数。`m = m & (m - 1)`是位操作技巧,每次操作都会清除`m`的最低位1,直到所有位都变为0。因此,`count`最终会输出`m`中1的个数。 3. **字符串处理与16进制转换** 题目要求将32位整数分解为一个4字节数组,高位在前,低位在后。这里使用了`itoa`函数将整数转换为16进制字符串,然后通过字符串操作将高位移到前面。`strcpy`和`strlen`用于在字符串末尾添加低位部分。这个题目考察了字符串处理和16进制转换能力。 4. **链表操作** 第一题是经典的“报数游戏”,要求找出最后留在圈内的人。可以通过模拟报数过程,每次报3的倍数时删除当前人,直到只剩下一个。第二题是合并两个有序链表,要求在不允许额外空间的情况下完成。可以使用一个虚拟头节点`H`,然后分别遍历两个链表,比较节点值并将其插入`H`后面,始终保持`H`后面的链表有序。 这些题目覆盖了C/C++编程中的基础和高级概念,包括指针、数组、位运算、字符串处理、链表操作等,对于准备面试的求职者来说是非常有价值的练习。