目录

1. 计算字符串的编辑距离

2. 微信红包

3. 双向链表修改,比如插入新的结点,一定要画图

4. 一颗完全二叉树第六层有9个叶结点(根为第一层),则结点个数最多有109

5. 将N条长度均为M的有序链表合并,步骤是拿出N条链表的第一个元素建立小根堆,依次从堆顶取出元素,将链表其他元素依次放入堆中,进行向下调整

6. 循环队列中,f为队头元素位置,r为当前队尾元素的下一个位置(书上是这么说的),则元素个数为(r-f+Max) % Max

7. 快排确定第几趟排序结果,要看有几个数满足左边大右边小的条件

8. 年终奖

9. 迷宫问题

10. 方法区用于存储JVM加载的类信息,常量,静态变量,以及编译器编译后的代码等数据,是线程共享的

11. for循环表达式中()位置可以放方法

12. java在运行时才进行翻译指令

13. 接口中的变量都是全局常量,也就是被public static final修饰,

14. 星际密码

15. 数根


1. 计算字符串的编辑距离

题目链接:计算字符串的编辑距离_牛客题霸_牛客网 (nowcoder.com)

题目要求:

题目分析:

问题:字符串A转换成字符串B的编辑距离

子问题:字符串A的子串转换成字符串B的子串的一部分的编辑距离

状态F(i,j):字符串A的前i个字符转换成字符串B的前j个字符的编辑距离

如果当前字符相等,直接那就等于前一个位置的情况也就是F[i,j] = F[i-1][j-1]

如果不相等,

如果不相等,要么B字符串插入A中i位置对应字符即dp[i][j]=dp[i-1][j]+1

要么A字符串插入B中j位置对应字符即dp[i][j]=dp[i][j-1]+1,要么s1字符串

i位置字符被s2字符串j位置字符替换,即dp[i][j]=dp[i-1][j-1]+1

状态转义方程:F(i,j)=min{F(i,j-1)+1,F(i-1,j)+1,F(i-1,j-1) +1

初始化:F(0,j)=j          F(i,0)=i

返回值F(ALen,Blen)

上代码

import java.io.*;
import java.lang.*;public class Main{public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str1;String str2 = "";if((str1 = br.readLine()) != null) {str2 = br.readLine();}int len1 = str1.length();int len2 = str2.length();int[][] count = new int[len1+1][len2+1];count[0][0] = 0;for (int i = 1; i <= len1; i++) {count[i][0] = i;}for (int i = 1; i <= len2; i++) {count[0][i] = i;}for (int i = 1; i <= len1; i++) {for (int j = 1; j <= len2; j++) {if(str1.charAt(i-1) == str2.charAt(j-1)) {count[i][j] = count[i-1][j-1];}else {count[i][j] = Math.min(Math.min(count[i-1][j],count[i][j-1]),count[i-1][j-1])+1;}}}System.out.println(count[len1][len2]);}
}

2. 微信红包

题目链接:微信红包__牛客网 (nowcoder.com)

题目要求:

题目分析:

找出现次数超过一半的数字

可以先给这个数组排个序,取这个排完序数字的中间值mid

遍历数组,统计mid出现的次数是否超过一半,如果有一半就返回这个mid

如果没有就返回0

上代码

import java.util.*;public class Gift {public int getValue(int[] gifts, int n) {Arrays.sort(gifts);//中间值int mid = gifts[n/2];int count = 0;for (int g : gifts) {if(g == mid) {count++;}}if(count > n/2) {return mid;}return 0;}
}

3. 双向链表修改,比如插入新的结点,一定要画图


4. 一颗完全二叉树第六层有9个叶结点(根为第一层),则结点个数最多有109

一颗完全二叉树第六层有9个叶结点(根为第一层),则结点个数最多有(D)

A. 112     B. 111      C. 107         D. 109

第六层有9个叶子结点,求最大结点个数,那就存在第7层,并且第六层是满的

前六层  1+2+4+8+16+32=63

第六层本身有2^5=32,除去9个叶子结点,还剩23个结点的度为2

所以第七层 23*2 = 46,总共63+46 = 109


5. 将N条长度均为M的有序链表合并,步骤是拿出N条链表的第一个元素建立小根堆,依次从堆顶取出元素,将链表其他元素依次放入堆中,进行向下调整

合并步骤:

1. 建立一个长度为N的最大/最小堆

将这N条链表的第一个元素拿出来建立最小堆,时间复杂度O(N)

2. 依次从最小堆中取出元素(堆顶),此时堆顶就是当前集合的最小值,将链表的其他元素放入堆中.

调整堆的时间复杂度(siftDown - O(logN)),总共还需要入堆的元素个数,O(N*M*logN)

3. 总共:建堆 + 不断调整堆(不断取出堆顶元素) O(N) + O(N*M*logN)

所以答案选A


6. 循环队列中,f为队头元素位置,r为当前队尾元素的下一个位置(书上是这么说的),则元素个数为(r-f+Max) % Max

针对这道题,力扣上有一个图非常清楚,可以解释答案为啥选B

需要注意的是本道题中r为当前队尾元素位置(最后一个元素的位置)


7. 快排确定第几趟排序结果,要看有几个数满足左边大右边小的条件

快排有个特点是,

每进行一次快排,标定点一定处在最终位置上

进行了两次快排,则至少有两个元素到达最终位置

也就是说第2趟排序结果肯定满足至少有2个数字其左边比它小右边比它大。所以选C


8. 年终奖

题目链接:年终奖_牛客题霸_牛客网 (nowcoder.com)

题目要求:

题目分析:

上代码

    public int getMost(int[][] board) {int row = board.length;int col = board[0].length;//第一行 和第一列for (int i = 1; i < col; i++) {board[0][i] += board[0][i-1];}for (int i = 1; i < row; i++) {board[i][0] += board[i-1][0];}//处理剩余位置for (int i = 1; i < row; i++) {for (int j = 1; j < col; j++) {board[i][j] += Math.max(board[i-1][j],board[i][j-1]);}}return board[row-1][col-1];}

9. 迷宫问题

题目链接:迷宫问题_牛客题霸_牛客网 (nowcoder.com)

题目要求:

题目分析:

上代码

import java.util.*;class Node {int x;int y;public Node(int x, int y) {this.x = x;this.y = y;}
}public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int row = scan.nextInt();int col = scan.nextInt();//创建迷宫int[][] mat = new int[row][col];for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {mat[i][j] = scan.nextInt();}}   //搜索路径ArrayList<Node> path = new ArrayList<>();ArrayList<Node> minPath = new ArrayList<>();int[][] book = new int[row][col];getMinPath(mat,row,col,0,0,book,path,minPath);//打印路径for(Node n : minPath) {System.out.println("(" + n.x + ',' + n.y + ")");}}//matL迷宫矩阵: row行 row列// x,y:当前位置// book:标记矩阵,标记当前位置是否走过// path:保存当前路径的每一个位置// minPath:保存最短路径private static void getMinPath(int[][] mat, int row, int col, int x, int y, int[][] book, ArrayList<Node> path, ArrayList<Node> minPath) {// 判断(x,y):是否越界,是否走过,是否有障碍if(x < 0 || x >= row || y < 0 || y >= col || book[x][y] == 1 || mat[x][y] == 1) {return;}//把当前位置存入路径中path.add(new Node(x,y));//标记当前位置book[x][y] = 1;//判断当前位置是否为出口if(x == row-1 && y == col-1) {//一条新的路径产生了//判断是否为更短路径if(minPath.isEmpty() || path.size() < minPath.size()) {//更新为更短路径minPath.clear();for(Node n : path) {minPath.add(n);}}}//如果不是出口,继续搜索(x,y)的上下左右四个方向getMinPath(mat,row,col,x+1,y,book,path,minPath);//下getMinPath(mat,row,col,x-1,y,book,path,minPath);//上getMinPath(mat,row,col,x,y+1,book,path,minPath);//右getMinPath(mat,row,col,x,y-1,book,path,minPath);//左//把当前位置从路径中删除,寻找新的路径path.remove(path.size()-1);book[x][y] = 0;//回退了,表示没有走过,改为0}
}

10. 方法区用于存储JVM加载的类信息,常量,静态变量,以及编译器编译后的代码等数据,是线程共享的

通过这张图可以看出方法区是线程共享的,所以C错


11. for循环表达式中()位置可以放方法

首先明白for(表达式1;表达式2;表达式3) {}  这个表达式的位置是可以放入方法的,我在做题时以为不可以,就直接选了C,     可以看到我把代码放入idea中是没有报错的

其次这道题就是考察的是    for循环中表达式的执行顺序问题

先执行表达式1和表达式2,如果满足就执行for循环中的语句,然后再执行表达式3,选A


12. java在运行时才进行翻译指令

下面关于程序编译说法正确的是 (C)

A. java语言是编译型语言,会把java程序编译成二进制机器指令直接放行

B. java编译出来的目标文件与具体操作系统有关

C. java在运行时才进行翻译指令

D. java编译出来的目标文件,可以运行在任意jvm上

A. java是半编译半运行的语言,A错

B. java编译出来的目标文件,是class它是与操作系统无关的,面向JVM的二进制文件,B错

C.编译阶段: javac 会把  *.java 编译为 *.class(与系统无关的,面向JVM的二进制文件)

运行阶段: java    JVM实际上此时会把class文件翻译成操作系统运行的机器码

D.JVM也是有版本的,JDK11的class文件  JDK8的JVM是无法运行的,D错


13. 接口中的变量都是全局常量,也就是被public static final修饰,

    public interface IService {String NAME = "default";}

默认类型等价表示是哪一项    (C)

    A.    public String NAME = "default";B.    public static String NAME = "default";C.    public static final String NAME = "default";D.    private String NAME = "default";

答案选C,这是因为接口中的变量都是全局常量,也就是被public static final修饰,


14. 星际密码

题目链接:星际密码__牛客网 (nowcoder.com)

题目要求:

题目分析:

上代码

(这个里面用到了String.format方法,这个方法是给第二参数(Object类型)传一个变量,然后根据第一个参数格式来进行打印)

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);while(scan.hasNext()) {int n = scan.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = scan.nextInt();}//斐波那契数组int[] F = new int[10001];F[0] = 1;F[1] = 1;for (int i = 2; i < F.length; i++) {F[i] = (F[i-1] + F[i-2])%10000;}StringBuffer sb = new StringBuffer();for (int i = 0; i < n; i++) {sb.append(String.format("%04d", F[i]));}System.out.println(sb);}}
}

15. 数根

题目链接:数根__牛客网 (nowcoder.com)

题目要求:

题目分析:

上代码

import java.util.*;
class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);while(scan.hasNext()) {String str = scan.nextLine();while(str.length() != 1) {int sum = 0;for(int i = 0; i < str.length(); i++) {sum += str.charAt(i) - '0';}str= String.valueOf(sum);}System.out.println(str);}}
}

刷题笔记之十一 (计算字符串的编辑距离+微信红包+年终奖+迷宫问题+星际密码+数根)相关推荐

  1. 刷题笔记(十四)--二叉树:层序遍历和DFS,BFS

    目录 系列文章目录 前言 题录 102. 二叉树的层序遍历 BFS DFS_前序遍历 107. 二叉树的层序遍历 II BFS DFS 199. 二叉树的右视图 BFS DFS 637. 二叉树的层平 ...

  2. 无意中发现的一份清华大佬的刷题笔记!

    对于刷题相关的文章,在之前我也推荐过不少,今天在给大家推荐一份算法刷题笔记,这份笔记与以往的刷题有所区别,作者把 Leetcode 一千多道题都进行了系统的整理,并且对于每一道题的代码,都要求 bea ...

  3. 《编程能力基础》刷题笔记(41 题)

    <编程能力基础>刷题笔记 1. 单调数列 题解:递归.模拟.API 2. 实现 strStr() 题解:API.暴力.滑动窗口 3. 平衡二叉树 题解:迭代 4. 重复的子字符串 题解:模 ...

  4. LeetCode《编程能力入门》刷题笔记(34 题全)

    LeetCode<编程能力入门>刷题笔记 基本数据类型 1. 在区间范围内统计奇数数目 _解法1:暴力迭代 _解法2:数学(找规律) 2. 去掉最低工资和最高工资后的工资平均值 _解法1: ...

  5. 《剑指 Offer I》刷题笔记 20 ~ 30 题

    <剑指 Offer I>刷题笔记 20_30 动态规划(简单) 20. 斐波那契数列 _解法1:迭代 解法2:记忆化递归 解法3:动态规划 21. 青蛙跳台阶问题 _解法1:动态规划 22 ...

  6. 《剑指 Offer I》刷题笔记 1 ~10 题

    <剑指 Offer I>刷题笔记 1 ~10 题 栈与队列(简单) 1. 用两个栈实现队列 _解法 1:暴力做法 解法 2:优化解法 1 2. 包含 min 函数的栈 _解法 1:pop( ...

  7. 生物信息学算法之Python实现|Rosalind刷题笔记:001 碱基统计

    前言 Rosalind is a platform for learning bioinformatics and programming through problem solving. Rosal ...

  8. LeetCode刷题笔记汇总

    LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...

  9. 《Data Structures and Algorithm Analysis in C》学习与刷题笔记

    <Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...

最新文章

  1. vs添加码云远程_项目git步骤,将项目托管到码云。git本地分支推送到远程分支...
  2. mysql数据万能导入工具下载_mysql数据导入工具下载 - 数据导入工具(EMS Data Export for MySQL) v3.7.0多语特别版下载 - 第九软件网...
  3. 微博与Redis系统技术文章记录
  4. iBatis for Net 代码生成器(CodeHelper)附下载地址(已经升级为V 1.1)
  5. Python3 网络爬虫:下载小说的正确姿势
  6. C++连接mysql及遇到的相关问题
  7. Dxperience 7.3.4 简体中文本地化
  8. 杭电1072 猜数字
  9. JAMA:Java矩阵包
  10. springboot在eclipse实现热部署
  11. Cadence学习篇(12) Cadence中使用Pspice进行电路仿真
  12. php中eregi,PHP 函数 eregi()
  13. 好用的三维绘图软件CREO学习标注尺寸
  14. OpenGL_Qt学习笔记之_03(平面图形的着色和旋转)
  15. 使用Qt实现阿里云API签名
  16. 联想计算机的控制面板在哪,Win10创意者的控制面板在哪?
  17. 神经网络 深度神经网络,深度神经网络训练
  18. mac终端查看php版本_Mac切换php版本方法
  19. 七夕学习礼物:轻巧好用的讯飞智能录音笔SR101
  20. Linux基础——磁盘配额

热门文章

  1. Unity学习笔记:Animator和Animation
  2. 2018年中小型B2B或B2C网站如何突破?
  3. 故障分析 | 报错 ERROR 5270 -HY000-- object not in RECYCLE BIN 引发的几个思考
  4. 解压tar.zx命令
  5. dq坐标系下无功功率表达式_一种单相脉冲整流器电网电压估算方法与流程
  6. 维基解密网站网址是什么
  7. Mobile-Former来了!微软提出:MobileNet+Transformer轻量化并行网络
  8. 阿布扎比将于2023年5月举办年度投资会议
  9. # 解决微信小程序遮罩层底部页面滚动
  10. HGOI11.1集训题解