这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战
反转链表
该题出自力扣的206题反转链表(简单题)
审题
给你单链表的头节点
head,请你反转链表,并返回反转后的链表。
-
就是输出一个反转后的链表
-
方法一:迭代
-
类似冒泡一样,对一个全新的链表不断赋予新值
- 定义一个全新的链表 + 一个引用原链表的链表
- while循环
- 取出链表的next节点
- 存储前一节点
- 把引用节点的next节点赋值为前一节点
-
编码
/**
* 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
* @param head
* @return
*/
public ListNode reverseList(ListNode head) {
// if (head == null)return head;
ListNode prev = null;
ListNode curr = head;
while (curr != null){
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
比赛中的配对次数
该题出自力扣的1688题——比赛中的配对次数【简单题】
审题
给你一个整数 n ,表示比赛中的队伍数。比赛遵循一种独特的赛制: 如果当前队伍数是 偶数 ,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍> > 进入下一轮。 如果当前队伍数为 奇数 ,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行 (n - 1) / 2 场比赛,> 且产生 (n - 1) / 2 + 1 支队伍进入下一轮。 返回在比赛中进行的配对次数,直到决出获胜队伍为止。
- 题目也很简单,就是比赛制,决出冠军所需要的的比赛次数
- 最开始没有跳出整个思想范围,直接用了while循环,并且把奇偶数的结果代入。
- 亦或者可以使用递归,万变不离其宗,循环是可以解决的
编码
public static int numberOfMatches(int n) {
int max = 0;
while(n == 1){
if((n & 1) == 0){
int mid = n/2;
max += mid;
n = mid;
}else {
int mid = (n-1)/2;
max += mid;
n = mid +1;
}
}
return max;
}
彩蛋篇
后来想了一下,感觉自己被算法绕进去了。一看到题目就被 解法+技巧 蒙蔽了双眼。正常来说 决出胜负,两两相争,最终 必定是 队伍数 - 1
public static int numberOfMatches(int n) {
return n -1;
}