算法入门(java)

Posted 微风撞见云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法入门(java)相关的知识,希望对你有一定的参考价值。

想用Java快速入门算法?这篇文章你得看!

提示:本文章适合想要入门算法,并且想 “快速” 达到一定成果的同学们阅读~ (不定期补充笔记)

文章非常非常非常长!!! 阅读需先看 “前言” 部分!!!

最近在备战蓝桥杯,还有许多笔记没有更新,省赛结束后统一更新内容


🌷 仰望天空,妳我亦是行人.✨
🦄 个人主页——微风撞见云的博客🎐
🐳 数据结构与算法专栏的文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🪁 希望本文能够给读者带来一定的帮助🌸文章粗浅,敬请批评指正!🐥


文章目录


前言

本篇内容是我学了一段时间算法以后,自己总结的心得,可能有些地方没写的太好,请大家见谅!如有想深入了解的地方,直接搜索相关内容学习即可!

随着时代越来越卷,考验“算法”逐渐成为了求职、比赛等选拔的常用方式,而java开发的岗位也越来越多,虽然大佬们都用c++,但有时候我们不得不用java来写算法。

刚接触算法的时候没人带,大二参加过蓝桥杯,硬是用语法硬顶,拿了个省二。后来学了一段时间算法,参加“计算机能力挑战赛java程序设计”获得决赛一等奖。虽然这些比赛含金量不高,但我还是想把我辛苦记录的笔记分享给大家!如果对你有帮助,希望可以点个赞支持一下~

刷题的话,看你是哪种比赛了,蓝桥杯那种建议你先刷蓝桥里面的题试试,因为leetcode上面不会要求你输入数据来使用,都是直接给你数据,让你写出方法即可,但是蓝桥杯那一类的OI需要你对输入的数据有一定的处理能力,这点很重要。并且不要盲目刷题、不要盲目刷题、不要盲目刷题!!! 重要的事情说三遍!正确的做法是学一类刷一类,比如我最近两天刷dfs的,感觉差不多了再刷dp的,以此类推。


正片开始 ↓

一、注意事项

如果你是打蓝桥杯那种类型的比赛,一定要把样例代码复制完整、并且注意样例范围、巧用编辑器(word搜索、Excel表格等)

  1. 不过大多数情况不会给你太长的样例,但我还是踩过一次坑,不踩不知道,比赛时真踩到了就很伤。
  2. 注意样例范围,初学算法的时候大多数会想着暴力求解,这时候你就要思考用其他方式来过全部样例,例如朴素djisktra一般会爆栈,要进行堆优化等套路。
  3. word、excel、计算机都可以用,如果它们能帮到你,请务必使用。

二、命题范围

很多同学不知道命题范围有哪些,这里以一个不太起眼的比赛:“全国高校计算机能力挑战赛”为例,说一下命题范围。

  • 数据结构:包括基础数据结构、树形结构、字符串、其他等。基本算法知识:包括基础算法、动态规划、搜索等。
  • 图论:包括最短路径(单源、任意)、生成树、匹配问题、网络流、其他等。
  • 数学:包括数论、组合数学、计算方法、计算几何、其他等知识。

蓝桥云课上说得更详细,比较适合想拿国奖的同学深入学习:








三、快捷键系列

Idea快捷键

public class 快捷键 
    /**
     * ctrl+shift+enter 代码结尾补全
     * ctrl+shift+Alt+J 修改同名变量
     * Alt + Enter   引入类
     * Ctrl+F 和 Ctrl + R 查找和替换
     * ctrl + Alt + L 代码格式格式换
     * ctrl + D 复制本代码到下一行
     * shift + Alt + ↑或↓  代码上下移动
     * 数组名.for  快速遍历数组
     * Alt + Insert    set/get; 构造方法;  toString; 重写方法。。。
     * Ctrl+Alt+T 将代码包在一个块中,例如 while, if, try/catch等
     * psvm 主函数
     * sout 输出语句
     * 给一小段代码添加()  [],只需要选中该部分代码,然后按(  [ 即可。
     * 在()内直接按;可以在代码末尾添加;
     */

Eclipse快捷键

public class Zfast 
        /**
         * alt + ctrl + ↓         复制当前行到下一行
         * alt + ↓                         移动当前行到下一行
         * ctrl + shift +f  格式化
         * alt + shift + a  块选择
         * ctrl + 1         创建对象等补全提示  new ArrayList<>();在这里按ctrl + 1  
         */

四、常用知识点、思想、套路(重点一)

多提取方法:

因为每次创建并且执行某些相同的操作,同样会花费时间,将相同的代码单独提取出来使用,用空间换时间

double科学计数eN

只有浮点类型才可以使用科学计数法形式表示。
(例如51200是一个int类型的,而512E2则是一个浮点型)

流程控制

1、continue 提前进入下一个循环 ;
2、break 结束for循环;
3、return 直接结束方法。

Three_Dimensional_Array (三维数组)

public class Three_Dimensional_Array 
    public static void main(String[] args) 
        int[][][] array = new int[3][2][3];//有三层,每层是一个2行3列的二维数组
        array = new int[][][] //创建并初始化数组
                1, 2, 3, 4, 5, 6,
                7, 8, 9, 10, 11, 12,
                13, 14, 15, 16, 17, 18
        ;
        for (int i = 0; i < array.length; i++) 
            System.out.println("这是第 " + i + " 层");
            for (int j = 0; j < array[0].length; j++) 
                for (int k = 0; k < array[0][0].length; k++) 
                    System.out.print(array[i][j][k] + " ");
                
                System.out.println();
            
        
      /*  //foreach的遍历方式 ——每个循环的状态更直观
        for (int[][] is : array)  //遍历数组
            for (int[] is2 : is) 
                for (int i : is2) 
                    System.out.print(i + "\\t");
                
            
        */


    

Scanner

0、无限输入,回车结束

public static void main(String[] args) 
    Scanner scanner = new Scanner(System.in);
    while (true) 
        String next = scanner.nextLine();
        if (!next.equals("")) System.out.println("有效");
        else break;
    

1、输入整数、字符串数组

第一行输入n, m
第二行输入n个整数
第三行输入m个字符串

//导入包
import java.util.Scanner;
import java.util.Arrays;
 
public class MyScanner 
 
        public static void main(String[] args) 
                
                //创建对象
                Scanner sc = new Scanner(System.in);                
                System.out.println("输入数据:");        
                //多行输入
                int n = sc.nextInt();
                int m = sc.nextInt();
                int[] arr = new int[n];        
                String[] str = new String[m];
                
                //int等基本数据类型的数组,用nextInt(),同行或不同都可以
                for(int i=0; i<n; i++) 
                        arr[i] = sc.nextInt();
                
                //String字符串数组, 读取用next(),以空格划分
                for(int i=0; i<m; i++) 
                        str[i] = sc.next();
                
                
        //调用方法进行操作
                TestSc(n, m, arr);
                TestStr(str);
                
                System.out.println("Test01 End");
                
                //关闭
                sc.close();
        
        
        public static void TestSc(int n, int m, int[] arr) 
                System.out.println("数据n:" + n + ", 数据m:" + m);
                System.out.println(Arrays.toString(arr));
        
        
        public static void TestStr(String[] str) 
                System.out.println(Arrays.toString(str));
        
                

若输入的字符串中想要包含空格,使用scanner.nextLine()换行后用scanner.nextLine()进行读入,见情形7.

2、输入二维数组

第一行输入n, m
第二行开始输入二维数组。

import java.util.Arrays;
import java.util.Scanner;
 
public class MyScanner2 
 
        public static void main(String[] args) 
                
                Scanner sc = new Scanner(System.in);                
                System.out.println("输入数据:");        
 
                //二维数组
                int n = sc.nextInt();
                int m = sc.nextInt();
                int[][] arr2 = new int[n][m];        
                System.out.println("Test02 输入二维数组数据:");
 
                //可以直接读入
                for(int i=0; i<n; i++) 
                        for(int j=0; j<m; j++) 
                                arr2[i][j] = sc.nextInt();
                        
                
 
                TestSc(n, m, arr2);
                //关闭
                sc.close();
        
        
        public static void TestSc(int n, int m, int[][] arr) 
                System.out.println("数据n:" + n + ", 数据m:" + m);
                for(int i=0; i<n; i++) 
                        System.out.println(Arrays.toString(arr[i]));
                
                System.out.println("数组行数: arr.length= "+ arr.length);
                System.out.println("数组列数: arr[0].length= "+ arr[0].length);
        
        

3、输入字符串

输入字符串,用空格隔开。
next()和nextLine()区别。

import java.util.Scanner;
/*
 *next()读取到空白停止,在读取输入后将光标放在同一行中。
 *nextLine()读取到回车停止 ,在读取输入后将光标放在下一行。
 */
 
public class MyScanner3 
 
        public static void main(String[] args) 
                
                Scanner sc = new Scanner(System.in);                
                System.out.println("输入字符串:");                
                
                //next():只读取输入直到空格。
                String str = sc.next();
 
                //nextLine():读取输入,包括单词之间的空格和除回车以外的所有符号
                String str2 = sc.nextLine();
 
                System.out.println("str:" + str);
                System.out.println("str2:" + str2);
                
                //关闭
                sc.close();
        
        

4、输入字符串分割为数组

先用scanner.nextLine()读入字符串,再将字符串分割为字符数组或字符串数组。

import java.util.*;
 
public class MyScanner4 
 
        public static void main(String[] args) 
                
                Scanner sc = new Scanner(System.in);        
                System.out.println("输入字符串数组:");
                
                String str;
                str = sc.nextLine();
                
                char[] ch = new char[str.length()];
                for(int i=0; i<str.length(); i++) 
                        //用charAt();进行定位分隔
                        ch[i] = str.charAt(i);
                        System.out.println(ch[i] + " ");
                
                System.out.println("END");
                
                //读入字符串后,用空格分隔为数组
                String[] strs = str.split(" ");
                System.out.println(Arrays.toString(strs));
 
        

5、连续输入数字和字符串

区别于情形1,对于不能采用for循环的方式获取String。采用情形5,6用来处理。
采用while(scanner.hasNext()) 循环,实现连续输入。
格式:数字,空格,字符串。
或: 数字,回车,字符串

import java.util.Scanner;
 
public class MyScanner5 
 
        public static void main(String[] args) 
                
                Scanner sc = new Scanner(System.in);
                
                while(sc.hasNext())                                         
                        int n = sc.nextInt();
                        String str = sc.next();
                        Tes(n, str);
                
                        
                sc.close();
        
        
        public static void Tes(int n, String str) 
                System.out.println("n = " + n);
                System.out.println("str = " + str);        
                System.out.println("str.length = " + str.length());
        
        

6、换行输入数字和字符串

也采用scanner.nextLine(),将光标移到下一行。再继续读入字符串。
第一行输入整数n,m,第二行开始输入字符串。或
第一行输入整数n,第二行输入m,第三行开始输入字符串。

import java.util.*;
 
public class MyScanner6 
 
        public static void main(String[] args) 
                Scanner sc = new Scanner(System.in);
                int n = sc.nextInt();
                int m = sc.nextInt();
                
                //注意!!!光标换到下一行
                sc.nextLine();
                
                String s = sc.nextLine();
                String str = sc.nextLine();
                
                System.out.println("n = " + n + " , m = " + m);
                System.out.println("s = " + s);
                System.out.println("str = " + str);
                                
     

以上是关于算法入门(java)的主要内容,如果未能解决你的问题,请参考以下文章

Java入门算法(树篇)

Java入门算法(动态规划篇1:初识动规)

Java入门算法(动态规划篇1:初识动规)

Java入门算法(动态规划篇2:01背包精讲)

Java入门算法(动态规划篇2:01背包精讲)

Java排序算法-Java入门|Java基础课程