算法刷题整理合集(四)

embedded/2025/3/18 13:37:13/

在这里插入图片描述

本篇博客旨在记录自已的算法刷题练习成长,里面注有详细的代码注释以及和个人的思路想法,希望可以给同道之人些许帮助。本人也是算法小白,水平有限,如果文章中有什么错误或遗漏之处,望各位可以在评论区指正出来,各位共勉💪。

文章目录

      • 1、反转字符串中的字符
      • 2、最大化股票交易的利润
      • 3、求解台阶问题
      • 4、用杂志拼接信件
      • 5、机器人的运动范围

1、反转字符串中的字符

实现一个算法来实现反转字符数组的功能。反转的要求如下:

  1. 将字符数组的字符进行反转,例如 [‘b’, ’ ', ‘a’, ‘r’] 变成 [‘r’, ‘a’, ’ ', ‘b’]。
  2. 将字符数组替换为反转后的数组。

解题代码:

java">import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String S = sc.nextLine();for (int i = S.length()-1; i >= 0; i--) {System.out.print(S.charAt(i));}}
}

2、最大化股票交易的利润

实现一个算法寻找最大化股票交易利润的策略。介绍如下:

  • 股票价格每天都在变化,以数组的索引表示交易日,以数组的元素表示每天的股票价格。
  • 可以通过买入和卖出获得利润。一天只能进行一次买入或卖出操作,一次买入加卖出操作称为一次交易次数。
  • 你只能交易一次,求使得利润最大的交易策略。

解题代码:

java">import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();int[] arr = new int[N];for (int i = 0; i < N; i++) {arr[i] = sc.nextInt();}sc.close();int max = -888;for (int i = 0; i < arr.length-1; i++) {for (int j = i+1; j < arr.length; j++) {int count = arr[j] - arr[i];if (count > max){max = count;}}}System.out.println(max);}
}

3、求解台阶问题

现一个算法求解台阶问题。介绍如下:

  • 对于高度为 n 的台阶,从下往上走,每一步的阶数为 1,2,3 中的一个。问要走到顶部一共有多少种走法。

输入描述:

输入一个数字 N (1≤N≤35)N (1≤N≤35),表示台阶的高度。

输出描述:

输出一行,为走法总数。

解题代码:

java">import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();System.out.println(reque(N));}// 迭代法public static int reque(int n){if (n == 1) return 1;if (n == 2) return 2;if (n == 3) return 4;int n1 = 1;int n2 = 2;int n3 = 4;int count = 0;for (int i = 4; i <= n; i++) {count = n1+n2+n3;n1 = n2;n2= n3;n3 = count;}return count;}
}

4、用杂志拼接信件

实现一个算法确定能否由杂志构成信件。介绍如下:

影视剧中信件大多是从报纸或杂志上的字符剪下来拼接而成的。

杂志和信件均由字符串构成,对于给定的杂志和信件,确定信件是否可以由杂志上的字符构成。

例如杂志为 ab,信件为 aa,则不能构成。杂志为 aab,信件为 aa,则可以构成。

输入描述:

输入两行字符串,长度均不超过 100。

第一行为杂志字符串,第二行为信件字符串。

输出描述:

输出一行,若信件可由杂志构成则输出 YES,否则输出 NO

解题代码:

java">import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str1 = sc.nextLine();String str2 = sc.nextLine();boolean flag = true;for (int i = 0,j=0; i < str1.length()&&j < str2.length(); i++,j++) {if (str1.charAt(i) != str2.charAt(j)) {System.out.println("NO");flag = false;break;}}if (flag) System.out.println("YES");}
}

5、机器人的运动范围

地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。

一个机器人从坐标 (0,0) 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。

但是不能进入行坐标和列坐标的数位之和大于 k 的格子。

请问该机器人能够达到多少个格子?

注意:

  1. 0<=m<=50
  2. 0<=n<=50
  3. 0<=k<=100

解题代码(BFS):

java">import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class Main_BFS {// Node类作为点的封装,包含x,y横纵坐标的属性static class Node {int x;int y;public Node(int x,int y) {this.x = x;this.y = y;}}// 返回res 表示最终结果public static int MovingOn(int threshold, int rows, int cols) {if (rows == 0 && cols == 0) return 0;int res = 1;// move数组表示向右,下,左,上前进一格。int[][] move = {{0,1},{1,0},{0,-1},{-1,0}};// book数组,0表示没走出,1表示走过。int[][] book = new int[rows][cols];// 机器人从(0,0)开始出发book[0][0] = 1;// 创建新的队列,用于记录机器人的坐标Queue<Node> queue = new LinkedList<>();queue.offer(new Node(0,0));// 当队列不为空时,也就是说机器人还有符合条件未抵达的坐标while (!queue.isEmpty()) {Node node = queue.poll();// 遍历上下左右四个方向,nx和ny记录坐标for (int i = 0; i < 4; i++) {int nx = node.x + move[i][0];int ny = node.y + move[i][1];// 判断坐标是方格内的,且未到达过,且行列的数位之和<=kif (nx >= 0 && ny >= 0 && nx < rows && ny < cols && book[nx][ny] == 0 && check(threshold,nx,ny)){res++;queue.offer(new Node(nx,ny));book[nx][ny] = 1;}}}return res;}// 判断行列坐标的每位数之和是否大于k,是就返回ture,反之falsestatic boolean check(int k, int i, int j) {int res = 0;while (i != 0) {res+= (i % 10);i /= 10;}while (j != 0){res += (j % 10);j /= 10;}return res <= k;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 输入格子大小m,n,以及横纵坐标之数位和小于等于kint k = sc.nextInt();int m = sc.nextInt();int n = sc.nextInt();System.out.println(MovingOn(k,m,n));}
}

解题代码(DFS):

java">import java.util.Scanner;public class Main_DFS {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int k = sc.nextInt();int m = sc.nextInt();int n = sc.nextInt();System.out.println(movingOn(k,m,n));}// 确定机器人到达的格子public static int movingOn(int threshold, int rows, int cols) {// 标记机器人已经走过的格子boolean[][] flag = new boolean[rows][cols];int ans = dfs(threshold, rows, cols, 0, 0, flag);return ans;}// 深度优先搜索public static int dfs(int threshold, int rows, int cols, int x, int y, boolean[][] flag) {if (x < 0 || y < 0 || x >= rows || y >= cols || sum(x,y) > threshold || flag[x][y]) {return 0;}// 上+下+左+右+起始点flag[x][y] = true;int up = dfs(threshold, rows, cols, x -1, y, flag);int down = dfs(threshold, rows,cols, x  +1, y, flag);int left = dfs(threshold, rows, cols, x, y -1, flag);int right= dfs(threshold, rows, cols, x, y + 1, flag);return up + down + left + right + 1;}// 横纵坐标的数位之和public static int sum(int x, int y){int ans = 0;while (x > 0 || y > 0) {int n1 = x % 10;int n2 = y % 10;ans += n1 + n2;x /= 10;y /= 10;}return ans;}
}

有帮助的话,希望可以点赞❤️+收藏⭐,谢谢各位大佬~~✨️✨️✨️


http://www.ppmy.cn/embedded/173601.html

相关文章

力扣hot100二刷——二叉树

第二次刷题不在idea写代码&#xff0c;而是直接在leetcode网站上写&#xff0c;“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路&#xff0c;编程也很流利⭐⭐Basically 基本掌握需要稍作思考&#xff0c;或者看到提示方法后能解答⭐⭐⭐Sl…

高级java每日一道面试题-2025年3月04日-微服务篇[Eureka篇]-Eureka是什么?

如果有遗漏,评论区告诉我进行补充 面试官: Eureka是什么&#xff1f; 我回答: 在Java高级面试中&#xff0c;关于Eureka的讨论通常会涵盖其基本概念、组件与架构、工作原理、高级特性以及与其他服务发现工具的比较等多个方面。以下是结合提供的内容对Eureka进行的详细解析和…

Python 鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

C++特性——智能指针

为什么需要智能指针 对于定义的局部变量&#xff0c;当作用域结束之后&#xff0c;就会自动回收&#xff0c;这没有什么问题。 当时用new delete的时候&#xff0c;就是动态分配对象的时候&#xff0c;如果new了一个变量&#xff0c;但却没有delete&#xff0c;这会造成内存泄…

每日学习Java之一万个为什么

场景启动器&#xff1a;starter 参考常见启动器 默认配置 官网默认值 依赖 见官网 / pom父依赖 注解 SpringBootApplication&#xff1a;启动自动装配&#xff0c;配合 main SpringApplication.run&#xff08;.class,args&#xff09; SpringBootTest&#xff1a;Spri…

MySQL数据库备份工具:binlog详细操作与实战指南

MySQL的binlog&#xff08;二进制日志&#xff09;是MySQL数据库中非常重要的日志文件&#xff0c;它记录了所有对数据库的修改操作&#xff08;如INSERT、UPDATE、DELETE等&#xff09;。通过 binlog&#xff0c;我们可以实现数据恢复、主从复制、数据审计等功能。因此&#x…

【多线程】单例模式

文章目录 1. 单例模式1.1 什么是单例模式1.2 为什么使用单例模式1.3 实现单例模式1.3.1 饿汉模式1.3.1 懒汉模式 1. 单例模式 1.1 什么是单例模式 单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。 单例 单…

vue2:el-table列中文字前面加icon图标的两种方式

1、文字前面加icon <el-table-column label="姓名" align="left" prop="nickName"><template #default="{ row }"><i v-if="row.sync" class="el-icon-lock"></i><span>{{ row.nic…