Java算法总结

文章目录

  • 一、链表相关
    • 1.1 从尾到头打印单链表[要求 方式1:反向遍历。方式2:Stack栈]
    • 1.2 josephu问题(使用带尾指针的循环链表)
  • 二、动态规划
    • 2.1 斐波那契数列 2022.4.18
    • 2.2 青蛙上台阶 2022.4.18
  • 三、位运算符
    • 3.1 二进制中1的个数 2022.4.18
  • 四、回溯算法
    • 4.1 打印从1到最大的n位数 2022.4.18
  • 五、双指针
    • 5.1 单链表反转 2022.4.18
    • 5.2 链表中倒数第k个节点 2022.4.18

一、链表相关

1.1 从尾到头打印单链表[要求 方式1:反向遍历。方式2:Stack栈]

// 上面的题的要求就是逆序打印单链表// 方式1:先将单链表进行反转操作,然后再遍历即可,这样做的问题就是会破坏原来的单链表的结构,不建议// * 方式2:可以利用栈这个数据结构,将各个结点压入栈中,然后利用栈的先进后出的特点,就实现了逆序打印public void printReverseLinkList() {if (head.next == null) return;Stack<T> stack = new Stack<>();// 遍历压栈Node<T> cur = head.next;while (cur != null) {stack.push(cur.getData());cur = cur.next;}// 出栈打印while (stack.size() > 0) {System.out.println(stack.pop());}}

1.2 josephu问题(使用带尾指针的循环链表)

package com.gyh.Link;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;/*** @author Gao YongHao* @version 1.0*/
public class SingleCircularLinkedListDemo {public static void main(String[] args) {SingleCircularLinkedList<Integer> integerSingleCircularLinkedList = new SingleCircularLinkedList<>();for (int i = 0; i < 10; i++) {integerSingleCircularLinkedList.add(i);}List<Integer> josephu = integerSingleCircularLinkedList.josephu(4, 6);josephu.forEach(System.out::println);}
}/*** 1. 创建尾结点* 2. 每次定位至数到 m 的结点的上一个结点位置(只有这样才可以更新信息)** @param <T>*/
class SingleCircularLinkedList<T> {// 不设置头结点(设置指向尾元素的指针)private Node<T> last;// 判断空public boolean isEmpty() {return last == null;}// 添加数据public void add(T d) {// 为空则直接创建if (isEmpty()) {last = new Node<>(d, null);last.setNext(last);return;}last.next = new Node<T>(d, last.next);last = last.next;}// 链表长度public int getLength() {// 为空则返回if (isEmpty()) return 0;int n = 1;Node<T> cur = last.next;while (cur != last) {n++;cur = cur.next;}return n;}// 约瑟夫问题public List<T> josephu(int k, final int m) {// 1 <= k <= nint n = getLength();assert k >= 1 && k <= n;if (n == 1) return Collections.singletonList(last.getData());// 循环出值List<T> out = new ArrayList<>();// pre初始为最后一个元素Node<T> pre = last;// 定位到 编号为 k 的前面一个人for (int i = 1; i < k; i++) {pre = pre.next;}// 报数到mwhile (true) {if (last.next == last) { // 只有一个元素out.add(last.getData());last = null;break;}// 获取数到m的结点的前面一个结点for (int i = 1; i < m; i++) {pre = pre.next;}// 从循环链表中删除该结点if (pre.next == last) last = pre; // 如果删除的是最后一个结点则将last指向preout.add(pre.next.getData()); // 将删除的结点值保存pre.next = pre.next.next;}return out;}
}

二、动态规划

2.1 斐波那契数列 2022.4.18

在这里插入图片描述

class Solution {// method1: 递归// public int fib(int n) {//     if(n==0){//         return 0;//     }//     if(n==1){//         return 1;//     }//     return fib(n-1)+fib(n-2);// }// method2: 记忆法// public static long[] fibs = new long[101];// static{//     fibs[0] = 0L;//     fibs[1] = 1L;// }// private static int curIndex = 1;// public int fib(int n) {//     if(n<=curIndex){//         return (int) fibs[n];//     }//     while(curIndex<n){//         curIndex++;//         fibs[curIndex] = (fibs[curIndex-1] + fibs[curIndex-2])% 1000000007;//     }//     return (int) fibs[n];// }// method3: 动态规划public int fib(int n) {if(n==0){return 0;}if(n==1){return 1;}int n1 = 0;int n2 = 1;int sum = 0;for(int i = 2;i<=n;i++){sum = (n1+n2)%1000000007;n1 = n2;n2 = sum;}return sum;}
}

2.2 青蛙上台阶 2022.4.18

在这里插入图片描述

在这里插入图片描述

class Solution {public int numWays(int n) {// 动态规划(等价于斐波拉切)if(n == 0){return 1;}if(n == 1){return 1;}int n1 = 1;int n2 = 1;int sum = 0;for(int i = 2; i <= n; i++){sum = (n1+n2) % 1000000007;n1 = n2;n2 = sum;}return sum;}
}

三、位运算符

3.1 二进制中1的个数 2022.4.18

https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/

在这里插入图片描述

在这里插入图片描述

public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {// method1: 从二进制的最右一位逐位判断1// int hw = 0;// while(n!=0){//     hw += n&1;//     n>>>=1; // 无符号右移// }// return hw;// method2: 利用 n&(n-1)int hw = 0;while(n!=0){hw++;n&=n-1; // 会将二进制最右侧的一去除}return hw;}
}

四、回溯算法

4.1 打印从1到最大的n位数 2022.4.18

在这里插入图片描述

// class Solution {
//     public int[] printNumbers(int n) {
//         // method1: 非大数打印
//         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;//     }
// }class Solution {// method2: 大数打印int[] res;char[] chars = {'0','1','2','3','4','5','6','7','8','9'};char[] nums;int n,count=0;public int[] printNumbers(int n) {this.n = n; // 最大的位数// 创建输出结果的int数组res = new int[(int)Math.pow(10,n)-1];nums = new char[n]; // nums为与最大位数个数相同的字符数组,用于保存每个数dfs(0);return res;}/**基于深度优先的字符打印*/private void dfs(int x){if(x == n){// 字符数组转换为字符串String nStr = String.valueOf(nums);// 字符串转换为数字// 不保留数字0int m;if((m=Integer.parseInt(nStr))!=0){res[count++] = m;}return;}for(char p:chars){nums[x] = p;dfs(x+1);}}}

五、双指针

5.1 单链表反转 2022.4.18

// 基于迭代
// 单链表的反转// 先定义一个结点 reverseHead=new Node// 从头到尾遍历原来的链表,每遍历一个结点,就将其取出,并放在新的链表的最前端(头插法)// 原来的链表的 head.next = reverseHead.nextpublic void reverseLink() {// 1. 没有数据或只有一个数据,就不操作if (head.next == null || head.next.next == null) return;// 设置反转链表的头结点Node<T> reverseHead = new Node<>(null, null);Node<T> cur = head.next;// 指向当前的结点Node<T> next; // 指向当前结点[cur]的下一个结点while (cur != null) {// 暂时保存当前结点的下一个结点next = cur.next;// 头插法cur.next = reverseHead.next;reverseHead.next = cur;// 更新当前结点位置cur = next;}head.next = reverseHead.next;}
package com.gyh.reverselinkedlist;/*** @author Gao YongHao* @version 1.0*/
public class ReverseList {public static void main(String[] args) {ListNode node5 = new ListNode(5, null);ListNode node4 = new ListNode(4, node5);ListNode node3 = new ListNode(3, node4);ListNode node2 = new ListNode(2, node3);ListNode node1 = new ListNode(1, node2);ListNode prev = recursion(node1);while (prev != null) {System.out.println(prev.val);prev = prev.next;}}public static ListNode iterate(ListNode node) {return null;}// 递归public static ListNode recursion(ListNode head) {// 如果头结点为null或找到尾元素则返回if (head == null || head.next == null) {return head;}// 递归返回最后一个结点的ListNode new_head = recursion(head.next);head.next.next = head;head.next = null;return new_head;}}class ListNode {Integer val;ListNode next;public ListNode(Integer val, ListNode next) {this.val = val;this.next = next;}
}

5.2 链表中倒数第k个节点 2022.4.18

在这里插入图片描述

在这里插入图片描述

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode getKthFromEnd(ListNode head, int k) {// int length = 0;// ListNode curr = head;// method1: 求全长+遍历// // 求链表长度// while(curr!=null){//     length++;//     curr = curr.next;// }// // 迭代获取倒数第k个结点// curr = head;// for(int i = 0;i<length-k;i++){//     curr = curr.next;// }// return curr;// method2: 基于快慢指针ListNode former=head, laster=head;// 让 former 先走 k 步for(int i = 0;i < k-1;i++){// 如果链表长度小于k则返回nullif(former == null) return null;former = former.next;}// 保持 former 与 laster的间距,使 former指向最后一个元素,则laster指向倒数第k个元素while(former.next!=null){former = former.next;laster = laster.next;}return laster;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/53999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

统信服务器操作系统【d版字符系统升级到dde图形化】配置方法

统信服务器操作系统d版本上由字符系统升级到 dde 桌面系统的过程 文章目录 一、准备环境二、功能描述安装步骤1. lightdm 安装2. dde 安装 一、准备环境 适用版本&#xff1a;■UOS服务器操作系统d版 适用架构&#xff1a;■ARM64、AMD64、MIPS64 网络&#xff1a;连接互联网…

几种修改docker默认存储位置的方法

需求 docker容器存放目录磁盘空间满了&#xff0c;需要转移数据&#xff0c;修改Docker默认存储位置 解决方法 方法&#xff11;&#xff1a;迁移到新目录 停止docker服务。 1systemctl stop docker; //每个liunx版本的命令不一样。创建新的docker目录&#xff0c;执行命令df…

为了有了ReentrantLock还需要ReentrantReadWriteLock?

ReentrantLock 和 ReentrantReadWriteLock 是 Java 中的两种不同实现的锁&#xff0c;它们各自适用于不同的应用场景。以下是为什么需要 ReentrantReadWriteLock 的几个原因&#xff1a; 1. 读写分离 ReentrantLock 是一种独占锁&#xff0c;适用于任何线程操作共享资源的场景…

kettle 数据库迁移 使用分页原理实现 数据库mysql

使用 kettle 9.0 先修改配置文件: C:\Users\xx\.kettle 新增如下配置,解决mysql 空字符串 自动转 null bug KETTLE_EMPTY_STRING_DIFFERS_FROM_NULLY git地址: GitHub - 2292011451/kettle_tool 第一步: 先把要迁移的表进行读取,循环查询每个表的最大数量以及页数,追加到…

linux文件系统权限详解

注:目录的执行权限代表是否可以进入。 一、文件权限控制对文件的访问: 可以针对文件所属用户、所属组和其他用户可以设置不同的权限 权限具有优先级。user权限覆盖group权限,后者覆盖other权限。 有三种权限类别:读取、写入和执行 读权限:对文件:可读取文件…

VS Code 配置 C/C++ 编程运行环境(保姆级教程)

文章目录 一、软件下载1. 下载 VS Code 安装工具 2. 下载 MinGW-W64二、安装 VS Code三、安装 MinGW-W64 及配置环境变量四、配置 VS Code 的 C/C 编程运行环境1. 汉化 VS Code&#xff08;选做&#xff09;2. 安装 C/C 扩展包 五、测试 VS Code 的 C/C 编程环境1. 创建代码文件…

ARM/Linux嵌入式面经(三三):大疆

嵌入式工程师考察主要蕴含:C/C++,处理器的架构,操作系统(linux或嵌入式实时操作系统),常见硬件接口协议/总线,文件存储系统等几方面 文章目录 1)C/C++static作用,变量加入static以后在内存中存储位置的变化。static的作用变量加入static后在内存中存储位置的变化面试官…

hku-mars雷达相机时间同步方案-软件驱动(MID360与海康MV-CB060-10UMUC-S)

hku-mars雷达相机时间同步方案-软件驱动 hku的方案在硬件和软件方面都做了工作&#xff0c;所以才会实现相机帧和雷达帧的完全对齐。硬件方面的设置请参考上一期。 港大的同步结果&#xff1a; hku-mars雷达相机时间同步方案-硬件&#xff08;MID360与海康MV-CB060-10UMUC-S&…

详解QT元对象系统用法

文章目录 元枚举 QMetaEnum元方法 QMetaMethod元对象构建 QMetaObjectBuilder元属性 QMetaProperty定义元对象属性获取属性信息与信号和槽结合QML属性访问动态属性元类型 QMetaTypeQt的元对象系统是Qt框架中的一个核心特性,它为Qt应用程序提供了一种动态类型信息机制。这种机制…

窗口嵌入桌面背景层(vb.net,高考倒计时特供版)

开发思路 根据系统生成高考倒计时的具体时间&#xff0c;附加江苏省省统考的时间生成算法&#xff0c;并且用户可以根据实际情况调整前后30天&#xff0c;具有丰富多彩的图片库和强大的自定义功能&#xff0c;效果图见P3 目前程序处于正式版的1.4版本&#xff0c;本程序由本作…

解决 webpack 配置 sass-loader后报错,无法正常build

1. 问题描述 总是打包build报错&#xff0c;本质上css样式语法也没写错在使用 sass-resources-loader 的项目中&#xff0c;开发者常常遇到构建错误或意外的样式行为&#xff0c;这是因为 sass-resources-loader 的作用和使用场景并不总是被正确理解。sass-resources-loader 主…

【HarmonyOS】鸿蒙头像上传-(编辑个人信息页- 头像上传)+实时数据更新

#效果图 #思路 ##步骤&#xff1a; ###一、利用picker api选择1张图片 实例化选择器参数(使用new PhotoSelectOptions())实例化图片选择器 (使用newPhotoViewPicker() )调用图片选择器的select方法传入选择器参数完成图片选取获得结果 利用picker api选择1张图片 async sele…

[Redis] Redis中的Hash类型和List类型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

智能体趋势:未来科技的核心驱动力

随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;**智能体&#xff08;intelligent agents&#xff09;**逐渐成为当今科技发展的重要趋势。这些智能体不仅仅是软件&#xff0c;它们正在改变我们生活和工作的方式&#xff0c;成为推动科技和社会变革的核心力…

eureka.client.service-url.defaultZone的坑

错误的配置 eureka: client: service-url: default-zone: http://192.168.100.10:8080/eureka正确的配置 eureka: client: service-url: defaultZone: http://192.168.100.10:8080/eureka根据错误日志堆栈打断电调试 出现两个key&#xff0c;也就是defaultZone不支持snake-c…

Go语言现代web开发defer 延迟执行

The defer statement will delay the execution of a function until the surrounding function is completed. Although execution is postponed, funciton arguments will be evaluated immediately. defer语句将延迟函数的执行&#xff0c;直到周围的函数完成。虽然执行被延…

SpringBoot用kafka.listener监听接受Kafka消息

1.创建kafka监听配置并进行注册 import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.common.serialization.StringDeserializer; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation…

【PCB工艺】如何实现PCB板层间的互连

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言①、什么是通孔②、通孔是怎样产生的③、通孔种类④、盘中孔⑤、设计建议 前言 送给大学毕业后找不到奋斗方向的你…

C++函数在库中的地址

本文讲述C如何直接调用动态库dll或者so中的函数。 首先我们准备一个被调用库&#xff0c;这个库里面有两个函数&#xff0c;分别是C98 与 C11 下的&#xff0c;名称是run2和run1。 被调用库 相关介绍请看之前的文章《函数指针与库之间的通信讲解》。 //dll_ex_im.h #ifndef…

OpenSSH9.8p1编译rpm包(建议收藏)

1.升级前的openssh版本 [root@ncayu8847 ~]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 20172.下载软件包(离线包) openssh 源码下载地址: https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssl源码下载 https:/