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;
}
}