算法小知识-------01.25-------简单 * 2

104 阅读2分钟

这是我参与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;
​
    }

image.png

比赛中的配对次数

该题出自力扣的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;
}

image.png

彩蛋篇

后来想了一下,感觉自己被算法绕进去了。一看到题目就被 解法+技巧 蒙蔽了双眼。正常来说 决出胜负,两两相争,最终 必定是 队伍数 - 1

public static int numberOfMatches(int n) {
    return n -1;
}