CodeTop算法(3.6-)

181 阅读1分钟

1 从尾到头打印链表。输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

输入: head = [1,3,2]
输出: [2,3,1]
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
        Stack<ListNode> stack = new Stack<ListNode>();
        ListNode p = head;
        while(p != null){
            stack.push(p);
            p = p.next;
        }
        int size = stack.size();
        int[] arr = new int[size];

        for(int i = 0;i < size;i++){
            arr[i] = stack.pop().val;
        }
        return arr;

    }
}

2 斐波那契数

package day0304to0306;

import java.util.Scanner;

/**
 * @author mk
 * @description
 * @create 2022-03-2022/3/6 15:57
 */
public class FIB {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入要计算的斐波那契数:");
        int n = input.nextInt();
        final int MOD = 1000000007;
        if (n < 2) {
            System.out.println(n);
        }else {
            int p=0,q=0,r=1;
            for(int i = 2;i <= n;i++){
                p = q;
                q = r;
                r = (p + q) % MOD;
            }
            System.out.println(r);
        }

        
        // return fib(n - 1) + fib(n - 2);

        FIB.main(args);
    }
}

3 青蛙跳台阶问题。一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

输入: n = 2
输出: 2

输入: n = 7
输出: 21

输入: n = 0
输出: 1

提示:0 <= n <= 100
class Solution {
    public int numWays(int n) {
        final int MOD = 1000000007;
        int a = 1,b = 1, sum = 2;
        if (n < 2) {
            return 1;
        }
        for(int i = 2;i <= n; i++){
            sum = (a+b)%MOD;
            a=b;
            b=sum;
        }
        return sum;
    }
}

4 二进制中1的个数.编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为 [汉明重量])。

提示:

  • 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
  • 在 Java 中,编译器使用 二进制补码 记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。
  • 输入必须是长度为 32 的 二进制串 。
示例 1:

输入:n = 11 (控制台输入 00000000000000000000000000001011)
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

输入:n = 128 (控制台输入 00000000000000000000000010000000)
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例 3:

输入:n = 4294967293 (控制台输入 11111111111111111111111111111101,部分语言中 n = -3)
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'
public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int count = 0;
        //若 n \& 1 = 0n&1=0 ,则 nn 二进制 最右一位 为 00 ;
        //若 n \& 1 = 1n&1=1 ,则 nn 二进制 最右一位 为 11 。
        while(n != 0) {
            count += n & 1;
            n >>>= 1;
        }
        return count;
    }
}

5 打印从1到最大的n位数。

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]

说明:

  • 用返回一个整数列表来代替打印
  • n 为正整数
class Solution {
    public int[] printNumbers(int n) {
        int end = (int)Math.pow(10, n) - 1;
        int[] res = new int[end];
        for(int i = 0; i < end; i++)
            res[i] = i + 1;
        return res;

    }
}

6 删除链表的节点

示例 1:

输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

示例 2:

输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        if (head == null) return null;
        if (head.val == val) return head.next;
        ListNode pre = head;
        ListNode nn = head.next;
        while(nn != null){  
            if(nn.val != val){
                pre = nn;
                nn = nn.next;  
            }else{
            pre.next = nn.next;
            return head;
            }
        
        }
        return head;
    }
}
//单指针。加节点
class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        ListNode temp = new ListNode(0);
        temp.next = head;
        head = temp;
        while(temp.next!=null){
            if(temp.next.val==val){
                temp.next = temp.next.next;
                return head.next;
            }
            temp = temp.next;
        }
        return head.next;
    }
}