小米公司面试题:判断一个单向链表是否有环?

今天去小米面试,面试官最后出了一道算法题,就是判断单向链表中是否有环?如下所示:无环链表和有环链表的区别。

我当时没有想到别的办法,就是说用一个容器HashSet来装遍历的节点,然后判断如果发现容器中包含了当前节点,那么就认为是有环的,遍历可以结束,否则遍历结束没有发现包含节点的,就是无环。 

面试官小姐姐特意说,如果链表中有重复关键字的节点,比如关键字为c的节点,怎么办呢?我说容器中装的是节点对象的引用,不是一个个孤立的没有任何关系的对象。小姐姐好像觉着这种办法不对。

后来,觉着这个办法应该是可以的,于是,模拟了一个有环链表和无环链表。通过Java实现了我的猜想,发现是可以判断的。

package com.xxx.algorithm;
import java.util.HashSet;
import java.util.Set;
public class LinkedListCircleDemo {
	public static void display(Node head){
		if(head==null)
			return;
		Node cur = head;
		System.out.print("list:");
		int count = 0;
		while(cur!=null){
			System.out.print(cur+"->");
			cur = cur.next;
			//这里是为了不让链表遍历时无限循环做的退出判断
			if(++count>10){
				break;
			}
		}
		System.out.print("null");
		System.out.println();
	}
	
	public static boolean hasCircle(Node head){
		Set<Node> 
### 小米嵌入式软件工程师算法题目 对于小米公司嵌入式软件工程师职位而言,算法题目的考察不仅限于基础的数据结构和算法设计能力,还涉及到实际应用场景中的优化问题以及对硬件资源的有效利用[^1]。 #### 一、链表反转 实现单向链表的原地反转操作是一个常见的面试题。该类问题旨在测试候选人是否能够熟练掌握指针的操作技巧,并理解内存分配机制。 ```c struct ListNode { int val; struct ListNode *next; }; // 反转链表函数定义 struct ListNode* ReverseList(struct ListNode* head){ struct ListNode *prev = NULL, *curr = head, *nextNode; while (curr != NULL) { nextNode = curr->next; // 记录下一个节点 curr->next = prev; // 当前节点指向前一个节点 prev = curr; // 移动到下一位置 curr = nextNode; } return prev; } ``` #### 二、动态规划求解斐波那契数列 此题用于评估应聘者解决递推关系的能力及其对空间复杂度的理解程度。 ```cpp int Fibonacci(int n) { if(n<=0)return 0; vector<int> dp(2); dp[0]=0; dp[1]=1; for(int i=2;i<=n;++i){ int sum = dp[0]+dp[1]; dp[0]=dp[1]; dp[1]=sum; } return dp[(n==0)?0:1]; } ``` #### 三、最短路径计算-Dijkstra算法 Dijkstra算法是图论中最经典的最短路算法之一,在很多场景下都有广泛应用。通过此类题目可以了解求职者的广度优先遍历(BFS)思想的应用水平。 ```python import heapq def dijkstra(graph,start): queue=[] heapq.heappush(queue,(0,start)) distance={node:float('inf')for node in graph}#初始化距离字典 distance[start]=0 while queue: dist,node=heapq.heappop(queue) if dist>distance[node]: continue for neighbor,cost in graph[node].items(): new_dist=dist+cost if new_dist<distance[neighbor]: distance[neighbor]=new_dist heapq.heappush(queue,(new_dist,neighbor)) return distance ``` 上述代码片段展示了三种不同类型的经典算法题目,这些题目可以帮助准备参加小米嵌入式软件工程师岗位的同学更好地理解和应对可能遇到的技术挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值