手撕java必备

刚需import

import java.util.Scanner;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.ArrayList; 
import java.util.List; 
import java.lang.System;
import java.io.*;
import java.util.*;

input场景

场景一:第一行单个整型数字a,代表第二行有a个数字,第二行的数字以空格(或其它字符)分开,把第二行的数字放进数组里

import java.util.Scanner;
import java.util.Arrays;
import java.lang.System;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);//输入int a = in.nextInt();in.nextLine(); // 消除nextInt()留下的换行符    String b=null;while (in.hasNextLine()) {// 第二行扫描为String bb = in.nextLine();     }String[] c=b.trim().split(" ");//.trim()可以去掉,以空格切割b为String[] cint[] d=new int[a];//用a,在某些场合换成c.length更万能for(int i=0;i<a;i++){d[i]=Integer.parseInt(c[i]);//String[] c强制转为int[] d}for(int i=0;i<a;i++){System.out.println(d[i]);//换行输出d}}
}

场景二:延申自【场景一】,但没有第一行的a,去掉a相关,并直接一行以空格(或其它字符)分隔的数字,只需要用c.length换成a

不改了,直接看场景一的注释来改

场景三:延申自【场景一】,但第一行a代表接下去要扫多少行的数字(或字符串等),后面的a行,用while循环,每行先存为一个数组,然后统计里面出现c这个字母出现的频率

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int a = scanner.nextInt(); for (int t = 0; t < a; t++) {String b = scanner.next(); // 读取每一行内容char[] charArray = b.toCharArray();//字符串变字符数组int count = 0;for (char c : charArray) {if (c == 'c') {count++;}}System.out.println(count);}}
}

【场景三】注意:(数组改为ArrayList)的“第一行a代表接下去要扫多少行的数字”,说明如果后面跟着的不止a行,也可以输入

        只是输入了a+n行,也只循环前a行内容。如果想要行多了或少了直接报错,而不输出任何循环行的答案,就应该使用ArrayList而不是数组,方便无限增加内容,在读取每一行时记录每行的字符计数,并在结束时检查总行数是否等于预期行数,如果不等于则输出错误信息。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int a = scanner.nextInt();int count_line = 0;List<Integer> row = new ArrayList<>();while (scanner.hasNext()) {String b = scanner.next(); // 读取每一行内容char[] charArray = b.toCharArray(); // 字符串变字符数组int count = 0;for (char c : charArray) {if (c == 'c') {count++;}}row.add(count);count_line++;}if (count_line == a) {// 如果行数正确,输出List内容for (int value : row) {System.out.println(value);}} else {System.out.println("行数不对");}}
}

场景四:延申自【场景二】,但不止一行,是两行未知且长度不同的、以空格(或其它字符)分隔的数字,扫描进两个数组

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String b = null;//第一行while (in.hasNextLine()) {b = in.nextLine();break;//一行一行地while并break}String[] c = b.trim().split(" ");int a = c.length; // 根据元素的数量确定数组的大小int[] array1 = new int[a];for (int i = 0; i < a; i++) {array1[i] = Integer.parseInt(c[i]);}   b = null;// 第二行while (in.hasNextLine()) {b = in.nextLine();break;}String[] d = b.trim().split(" ");int[] array2 = new int[d.length];for (int i = 0; i < d.length; i++) {array2[i] = Integer.parseInt(d[i]);}System.out.println("Array 1:");//换行输出第一个数组for (int i = 0; i < array1.length; i++) {System.out.println(array1[i]);}System.out.println("Array 2:");//换行输出第二个数组for (int i = 0; i < array2.length; i++) {System.out.println(array2[i]);}}
}

场景五:延申自【场景四】,但不止两行,是若干行未知且长度不同的、以空格(或其它字符)分隔的数字,

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);List<List<Integer>> numberList = new ArrayList<>();while (scanner.hasNextLine()) {String line = scanner.nextLine();String[] numbersAsString = line.split("\\s+"); // 分隔数字,这里使用空格分隔List<Integer> numbers = new ArrayList<>();for (String num : numbersAsString) {numbers.add(Integer.parseInt(num));}numberList.add(numbers);}// 输出ArrayList内容for (List<Integer> numbers : numberList) {for (int i = 0; i < numbers.size(); i++) {System.out.print(numbers.get(i));if (i < numbers.size() - 1) {System.out.print(" ");//防止每一行最后多输入一个空格}}System.out.println();}}
}

其它场景注意:

防止input出问题

public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);try {} catch (Exception e) {System.out.println("Error reading input. Please provide valid input.");} finally {scanner.close();}}
}

好用的函数

函数一:输入一个字符串,判断需要按几遍大小写切换

private static int calculateKeyPresses(String s) {int keyPresses = 0;boolean capsLock = false;for (char c : s.toCharArray()) {if (Character.isUpperCase(c) != capsLock) { // 需要按下CapsLock键keyPresses++;capsLock = !capsLock;}keyPresses++;// 按下字母键}return keyPresses;
}

   

矩阵转换

import java.io.*;
import java.util.*;class Solution {public void myFunc(ArrayList<ArrayList<Integer>> arr) {int numRows = arr.size();int numCols = arr.get(0).size();for (int j = 0; j < numCols; j++) {for (int i = 0; i < numRows; i++) {System.out.print(arr.get(i).get(j));if (i < numRows - 1) {System.out.print(" ");}}System.out.println();}}
}public class Main {public static void main(String args[]) {Scanner cin = new Scanner(System.in);ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();while (cin.hasNextLine()) {ArrayList<Integer> row = new ArrayList<Integer>();String line = cin.nextLine();if (line.length() > 0) {String[] arrLine = line.split(" ");for (int i = 0; i < arrLine.length; i++) {row.add(Integer.parseInt(arrLine[i]));}arr.add(row);}}new Solution().myFunc(arr);}
}

   

搜索

深度优先搜索(DFS

class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}public class DepthFirstSearch {public void dfs(TreeNode root) {if (root == null) {return;}System.out.print(root.val + " "); // 访问当前节点dfs(root.left);  // 递归遍历左子树dfs(root.right); // 递归遍历右子树}public static void main(String[] args) {DepthFirstSearch dfs = new DepthFirstSearch();// 构建二叉树TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);// 深度优先搜索dfs.dfs(root);}
}

广度优先搜索(BFS)

import java.util.LinkedList;
import java.util.Queue;public class BreadthFirstSearch {public void bfs(TreeNode root) {if (root == null) {return;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {TreeNode current = queue.poll();System.out.print(current.val + " "); // 访问当前节点if (current.left != null) {queue.offer(current.left); // 将左子节点加入队列}if (current.right != null) {queue.offer(current.right); // 将右子节点加入队列}}}public static void main(String[] args) {BreadthFirstSearch bfs = new BreadthFirstSearch();// 构建二叉树TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);// 广度优先搜索bfs.bfs(root);}
}

排序算法

排序算法是一类将一组元素按照特定顺序重新排列的算法。以下是一些常见的排序算法:

  1. 冒泡排序(Bubble Sort):
    • 比较相邻的元素,如果顺序错误就交换它们,重复这个过程直到整个数组排序完成。
    • 时间复杂度:平均 O(n^2),最坏 O(n^2)。
  1. 选择排序(Selection Sort):
    • 从未排序的部分选择最小的元素,与未排序部分的第一个元素交换位置,重复这个过程直到整个数组排序完成。
    • 时间复杂度:平均 O(n^2),最坏 O(n^2)。
  1. 插入排序(Insertion Sort):
    • 将数组分为已排序和未排序两部分,每次从未排序部分取出一个元素插入到已排序部分的正确位置。
    • 时间复杂度:平均 O(n^2),最坏 O(n^2)。
  1. 归并排序(Merge Sort):
    • 利用分治法,将数组分成两半,分别排序后再合并。
    • 时间复杂度:平均 O(n log n),最坏 O(n log n)。
  1. 快速排序(Quick Sort):
    • 选择一个基准元素,将数组分为两部分,左边的元素小于基准,右边的元素大于基准,然后递归地对两部分进行排序。
    • 时间复杂度:平均 O(n log n),最坏 O(n^2)。
  1. 堆排序(Heap Sort):
    • 构建一个最大堆(或最小堆),不断地将堆顶元素与最后一个元素交换,然后重新调整堆,直到整个数组有序。
    • 时间复杂度:平均 O(n log n),最坏 O(n log n)。
  1. 希尔排序(Shell Sort):
    • 是插入排序的改进版,通过对数组进行多次分组和插入排序,逐渐减小分组的间隔,直到间隔为1时进行最后一次插入排序。
    • 时间复杂度:平均 O(n log n),最坏取决于间隔序列。
  1. 计数排序(Counting Sort):
    • 计数排序假设输入的数据是由确定的范围内的整数构成,通过计数每个元素的出现次数,然后进行排序。
    • 时间复杂度:O(n + k),其中 k 是非负整数的最大值。
  1. 桶排序(Bucket Sort):
    • 将数据分散到有限数量的桶中,对每个桶中的数据进行排序,然后按照桶的顺序将数据合并。
    • 时间复杂度:取决于桶的数量和每个桶内的排序算法。

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

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

相关文章

Halcon 一维测量

文章目录 算子矩形算子弧形算子移动到新的参考点 Halcon 案例测量保险丝的宽度&#xff08;边缘对测量&#xff09;使用助手进行测量 halcon 案例获取芯片引脚的个数平均宽度距离&#xff0c;连续两个边缘的距离&#xff08;measure_pos &#xff09;halcon 定位测量Halcon 测量…

科普:大语言模型中的量化是什么意思?

大语言模型是指能够处理大规模文本数据的深度学习模型&#xff0c;例如GPT-3、BERT等。这些模型通常有数十亿甚至数百亿个参数&#xff0c;占用大量的存储空间和计算资源。为了提高这些模型的效率和可移植性&#xff0c;一种常用的方法是模型量化。 1&#xff1a;什么是模型量化…

代码随想录算法训练营第三十七天|738.单调递增的数字、968.监控二叉树、总结

题目&#xff1a;738.单调递增的数字 文章链接&#xff1a;代码随想录 视频链接&#xff1a;LeetCode:738.单调递增的数字 题目链接&#xff1a;力扣题目链接 图释&#xff1a; 从后向前遍历&#xff0c;当后一位数大于前一位位数时&#xff0c;前一位数减减&#xff0c;后…

Java基础面试题-2day

面向对象 创建一个对象用什么运算符&#xff0c;对象实体和对象引用有什么不同&#xff1f; 创建对象使用new String A new String(); A即为对象引用&#xff0c;通过new运算符&#xff0c;创建String()类型的对象实体。 对象引用的存储位置在栈内存 对象实体的存储位置在堆…

【算法】使用优先级队列(堆)解决算法题(TopK等)(C++)

文章目录 1. 前言2. 算法题1046.最后一块石头的重量703.数据流中的第K大元素 2.5 如何选择大根堆 与 小根堆&#xff1f; 为什么选择大根堆&#xff08;小根堆&#xff09;&#xff1f;692.前K个高频单词295.数据流的中位数 1. 前言 我们知道&#xff1a;优先级队列是一种常用…

Maven 基础安装配置及使用

大家好我是苏麟 , 今天聊聊Maven . Maven Maven , 是Apache公司下基于Java开发的开源项目 . 我们构建一个项目需要用到很多第三方的类库&#xff0c;需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌&#xff0c;并且Jar包之间的关系错综复杂&#xff0c;一…

高并发缓存问题分析以及分布式锁的实现

一,场景概述: 在高并发的环境下,比如淘宝,京东不定时的促销活动,大量的用户访问会导致数据库的性能下降,进而有可能数据库宕机从而不能产生正常的服务,一般一个系统最大的性能瓶颈&#xff0c;就是数据库的io操作,如果发生大量的io那么他的问题也会随之而来。从数据库入手也是…

Python | 六、哈希表 Hash Table(列表、集合、映射)

哈希表基础 哈希表是一类数据结构&#xff08;哈希表包含数组、集合和映射&#xff0c;和前两篇文章叙述的字符串、链表平级&#xff09;哈希表概念&#xff1a;类似于Python里的字典类型&#xff0c;哈希表把关键码key值通过哈希函数来和哈希表上的索引对应起来&#xff0c;之…

Vue2:解绑自定义事件

一、场景描述 上一节&#xff0c;我们学习了&#xff0c;自定义事件绑定到组件上。 现在&#xff0c;我们学习下&#xff0c;给组件解绑自定义事件的几种方法。 首先&#xff0c;我们试想一下&#xff0c;这个功能的适用场景&#xff1f; 一般同学都会想&#xff0c;解绑&…

力扣第236题——二叉树的最近公共祖先 (C语言题解)

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

【196】JAVA8 用 DOM 方式的 API 解析XML文件,无需引入第三方依赖。

JAVA8 可以使用标准的 DOM 方式的 API 来编写代码解析 XML 文件&#xff0c;无需引入第三方依赖。下面是两个测试用的 XML 文件&#xff1a; test.xml <allData><pan attr1"a" attr2"b">1</pan><tilt>2</tilt><zoom>…

【论文总结】基于深度学习的特征点提取,特征点检测的方法总结

这里写目录标题 相关工作1. Discriminative Learning of Deep Convolutional Feature Point Descriptors(2015)网络结构sift算法损失函数的构建 2.MatchNet(2015)网络中的组成部分其他组成部分损失函数结果 3.LIFT: Learned Invariant Feature Transform(2016)网络结构训练网络…

【Spring Boot 3】【Redis】基本数据类型操作

【Spring Boot 3】【Redis】基本数据类型操作 背景介绍开发环境开发步骤及源码工程目录结构背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…

虚拟线程探索与实践

优质博文&#xff1a;IT-BLOG-CN 一、简介 虚拟线程是轻量级线程&#xff0c;极大地减少了编写、维护和观察高吞吐量并发应用的工作量。虚拟线程是由JEP 425提出的预览功能&#xff0c;并在JDK 19中发布&#xff0c;JDK 21中最终确定虚拟线程&#xff0c;以下是根据开发者反馈…

【LeetCode每日一题】2171. 拿出最少数目的魔法豆

2024-1-18 文章目录 [2171. 拿出最少数目的魔法豆](https://leetcode.cn/problems/removing-minimum-number-of-magic-beans/)思路&#xff1a; 2171. 拿出最少数目的魔法豆 思路&#xff1a; 对输入的数组进行排序&#xff0c;使得数组中的元素按照升序排列。初始化一个变量s…

SQL注入实战操作

一&#xff1a;SQl注入分类 按照注入的网页功能类型分类&#xff1a; 1、登入注入&#xff1a;表单&#xff0c;如登入表单&#xff0c;注册表单 2、cms注入&#xff1a;CMS逻辑:index.php首页展示内容&#xff0c;具有文章列表(链接具有文章id)、articles.php文 章详细页&a…

阿里云腾讯七牛内容安全配置

一&#xff0c;阿里云 1&#xff0c;配置RAM角色权限 向RAM用户授权系统策略权限&#xff1a;AliyunYundunGreenWebFullAccess 2&#xff0c;内容安全控制台——授权访问OSS 不授权——会报错——no permission(not authorized about role AliyunCIPScanOSSRole)

Linux 【C编程】 引入线程,线程相关函数

1.线程的引入 1.1使用线程同时读取键盘和鼠标 代码演示&#xff1a; #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <termios.h> #include <fcntl.h> #include <string.h> // 读取…

前端面试题(持续更新~~)

文章目录 一、基础1、数组常用的方法2、数组有哪几种循环方式&#xff1f;分别有什么作用&#xff1f;3、字符串常用的方法4、原型链5、闭包6、常见的继承7、cookie 、localstorage 、 sessionstrorage区别8、数组去重方法9、http 的请求方式10、数据类型的判断方法11、cookie …

性能压力测试:企业成功的关键要素

性能压力测试在现代企业软件开发中扮演着至关重要的角色&#xff0c;它不仅仅是一项技术手段&#xff0c;更是保障企业成功的关键要素。本文将探讨性能压力测试在企业中的重要性&#xff0c;并阐述其对业务稳定性、用户体验和品牌声誉的影响。 一、保障业务稳定性 1、应对高负载…