数据结构是计算机科学中的核心概念,它涉及到如何有效地组织和存储数据,以便高效地访问和操作。在软件公司的面试和笔试中,数据结构题目经常被用来评估候选人的基础能力和问题解决技巧。本题包含了两个与数据结构密切相关的题目,分别是关于链表操作和字符串处理的问题。 1. **链表操作:寻找倒数第N个节点** 在无循环单链表中找到倒数第N个节点,可以通过双指针法实现。首先创建两个指针,都指向链表头。然后第一个指针先向前移动N步,之后两个指针同步移动,直到第一个指针到达链表尾部,此时第二个指针就指向了倒数第N个节点。 ```c typedef struct ListNode { int val; struct ListNode *next; } ListNode; ListNode* findKthFromEnd(ListNode* head, int k) { ListNode* slow = head; ListNode* fast = head; for (int i = 0; i < k - 1 && fast != NULL; ++i) { fast = fast->next; } if (fast == NULL) return NULL; // 如果k大于链表长度,返回NULL while (fast->next != NULL) { slow = slow->next; fast = fast->next; } return slow; } ``` 测试用例: ``` // 创建链表 1->2->3->4->5 ListNode* list = createList(1, 2, 3, 4, 5); ListNode* result = findKthFromEnd(list, 3); // 应该返回2 ``` 2. **字符串处理:找出两个字符串的公共字符** 这个问题可以通过位运算或哈希表来解决。这里我们使用哈希表来演示。遍历第一个字符串,将每个字符作为键存入哈希表,值表示字符出现的次数。再遍历第二个字符串,检查字符是否在哈希表中,如果在且值大于0,将字符添加到结果字符串中并更新哈希表中的计数。 ```c void findCommonChars(const char* str1, const char* str2, char* result) { int hash[256] = {0}; // 计算str1中每个字符的出现次数 for (int i = 0; str1[i]; ++i) { hash[str1[i]]++; } // 检查str2中的字符是否在str1中出现过 for (int i = 0; str2[i]; ++i) { if (hash[str2[i]] > 0) { result[strlen(result)] = str2[i]; hash[str2[i]]--; } } result[strlen(result)] = '\0'; // 结束符 } int main() { char str1[] = "i am not very happy"; char str2[] = "what are you doing"; char commonChars[100]; memset(commonChars, 0, sizeof(commonChars)); findCommonChars(str1, str2, commonChars); printf("Common characters: %s\n", commonChars); // 输出 "i anoteryh" } ``` 时间复杂度分析:对于两个字符串长度分别为m和n,哈希表构建的时间复杂度是O(m),遍历第二个字符串的时间复杂度是O(n)。因此,总的时间复杂度是O(m+n)。 这两个问题都展示了数据结构在实际编程问题中的应用,尤其是在优化算法效率方面。熟练掌握链表操作和字符串处理技术,是成为一名优秀的C++高级软件开发工程师所必需的。
- 粉丝: 7
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助