Python技术迷

川大数学博士吐槽,华为招数学博士的要求非常奇怪~

最近,一个川大数学博士的求职故事在网上引发了热议。他发现自己投递到华为的简历竟然石沉大海,这让他表示不理解:作为川大数学系的博士生,还获得过诸多奖项,例如国家一等奖以及论文等,自己竟然连个回音都没有?

Image

再仔细看招聘信息,华为更倾向于那些有着强大编程能力、在国际会议和学术期刊上有所建树的应用数学和计算数学领域的人才。这显然和他的理论数学背景不太匹配。

Image

专属福利 
👉点击领取:最全Python资料合集

而网友们的回应也是一针见血,华为作为一家注重应用技术的民营企业,并不是单纯追求理论知识的科研机构。他们更看重的是那些既懂数学又能编程,能将理论知识应用于实践的“技术实干家”。

Image

更有网友直言,如果理论知识不能转化为实际应用,那么一个勤劳的“搬砖工”可能比一个空有学问的博士更加受到企业的青睐。

Image

这虽然听起来有些扎心,但却反映了一个事实:在职场上,实用才是硬道理。

下面分享一道大厂的算法题

今日算法题,来自LeetCode的第19题:删除链表的倒数第 N 个结点,很多大厂都考过,下面是我的算法思路及实现,让我们来看看吧。

删除链表的倒数第 N 个结点

算法题目

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头节点。

引言

删除链表的倒数第N个节点是一道常见的链表操作题目,它测试了对链表结构的理解以及对双指针技术的应用能力。本文将介绍如何通过一次遍历实现该功能,并提供C语言、Java和Python的实现代码。

算法思路

本题的关键是如何一次遍历就找到倒数第N个节点。我们可以使用双指针技术(快慢指针技术):

  1. 初始化两个指针:让一个指针(快指针)先向前移动 n 步。

  2. 同时移动两个指针:然后两个指针(快慢指针)同时开始移动,直到快指针到达链表末尾。

  3. 删除操作:此时,慢指针指向的下一个节点就是需要删除的节点。将慢指针的下一个节点指向下下个节点,即可完成删除操作。

注意:为了方便处理边界情况(如删除的是头节点),通常会添加一个哑节点(dummy node)作为链表的新头节点。

代码实现

C语言实现
#include <stdio.h>#include <stdlib.h>
typedef struct ListNode { int val; struct ListNode *next;} ListNode;
// 删除链表的倒数第N个节点struct ListNode* removeNthFromEnd(struct ListNode* head, int n) { struct ListNode *dummy = (struct ListNode *)malloc(sizeof(struct ListNode)); dummy->val = 0; dummy->next = head; struct ListNode *fast = dummy; struct ListNode *slow = dummy; // 快指针先走n+1步 for (int i = 0; i < n + 1; i++) { fast = fast->next; } // 快慢指针同时走 while (fast != NULL) { fast = fast->next; slow = slow->next; } // 删除操作 struct ListNode *toDelete = slow->next; slow->next = slow->next->next; free(toDelete); struct ListNode *newHead = dummy->next; free(dummy); return newHead;}
Java实现
public class ListNode {    int val;    ListNode next;    ListNode(int x) { val = x; }}
public class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dummy = new ListNode(0); dummy.next = head; ListNode fast = dummy; ListNode slow = dummy; // 快指针先走n+1步 for (int i = 1; i <= n + 1; i++) { fast = fast.next; } // 快慢指针同时走 while (fast != null) { fast = fast.next; slow = slow.next; } // 删除操作 slow.next = slow.next.next; return dummy.next; }}
Python实现
class ListNode:    def __init__(self, val=0, next=None):        self.val = val        self.next = next
def remove_nth_from_end(head, n): dummy = ListNode(0) dummy.next = head fast = slow = dummy # 快指针先走n+1步 for _ in range(n + 1): fast = fast.next # 快慢指针同时走 while fast: fast = fast.next slow = slow.next # 删除操作 slow.next = slow.next.next return dummy.next

算法解析

该算法的时间复杂度为O(L),其中L是链表的长度,因为我们只遍历了一次链表。空间复杂度为O(1),只使用了固定的额外空间。

示例和测试

假设链表为 `1->2->3->4->5`,`n = 2`,删除倒数第2个节点后,链表变为 `1->2->3->5`。

总结

删除链表的倒数第N个节点是一个经典问题,通过双指针技术可以有效地解决。理解并掌握这种技术对于处理链表相关的问题非常有帮助。

Image
 1
Image
热门推荐

Image