zoukankan      html  css  js  c++  java
  • LeetCode刷题

    1.字符串最后一个单词的长度

    计算字符串最后一个单词的长度,单词以空格隔开。

    输入描述:

    一行字符串,非空,长度小于5000。

    输出描述:

    整数N,最后一个单词的长度。

    示例1

    输入

    hello world

    输出

    5
    import java.util.Scanner;
    
    /**
     * 计算字符串最后一个单词的长度,单词以空格隔开。
     *
     */
    public class Main {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            while (scanner.hasNext()) {
                String s = scanner.nextLine();
                String[] words = s.split(" ");
                System.out.println(words[words.length-1].length());
            }
        }
    }

    2.计算字符个数

    写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。

    输入描述:

    第一行输入一个有字母和数字以及空格组成的字符串,第二行输入一个字符。

    输出描述:

    输出输入字符串中含有该字符的个数。

    示例1

    输入

    ABCDEF
    A

    输出

    1
    import java.util.Scanner;
    
    /**
     * 接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
     *
     */
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            String s = input.next().toUpperCase();
            char c = input.next().toUpperCase().charAt(0);
            int count = getNum(s, c);
            System.out.println(count);
        }
    
        /*public static int getNum(String s, char c) {
            char[] arr = s.toCharArray();
            int count = 0;
            for (char i : arr) {
                if (i == c)
                    count++;
            }
            return count;
        }*/
    
        public static int getNum(String s, char c) {
            int count = 0;
            for (int i = 0; i < s.length(); i++) {
                if (c == s.charAt(i))
                    count++;
            }
            return count;
        }
    }

    3.去重和排序

    对一组数据完成去重与排序的工作,注意第一个数字为数据的个数。

    import java.util.Scanner;
    import java.util.Set;
    import java.util.TreeSet;
    
    /**
     * 对一组数据完成去重与排序的工作
     * 
     */
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                int num = input.nextInt();
                Set<Integer> set = new TreeSet<>();
                for (int i = 0; i < num; i++) {
                    set.add(input.nextInt());
                }
    
                for (Integer i : set) {
                    System.out.print(i + " ");
                }
                System.out.println();
            }
        }
    
    }

    4.字符串分割与补零

    •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; 

    •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

    输入描述:

    连续输入字符串(输入2次,每个字符串长度小于100)

    输出描述:

    输出到长度为8的新字符串数组

    示例1

    输入

    abc
    123456789

    输出

    abc00000
    12345678
    90000000
    import java.util.Scanner;
    
    /**
     * •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;
     * •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
     */
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNextLine()) {
                String s = input.nextLine();
                splitString(s);
                System.out.println();
            }
        }
    
        public static void splitString(String s) {
            while (s.length() >= 8) {
                System.out.print(s.substring(0, 8)+" ");
                s = s.substring(8);
            }
            
            if (s.length() < 8 && s.length() > 0) {
                s = s + "0000000";
                System.out.print(s.substring(0, 8));
            }
        }
    }

    5.十六进制转换为十进制

    写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。(多组同时输入 )

    输入描述:

    输入一个十六进制的数值字符串。

    输出描述:

    输出该数值的十进制字符串。

    示例1

    输入

    0xA

    输出

    10
    import java.util.Scanner;
    
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                String s = input.nextLine();
            /*    char[] arr = s.toCharArray();
                int result = 0;
                int index = 0;
                for (int i = arr.length - 1; i > 1; i--) {
                    int num = conversion(arr[i]);
                    result += num * Math.pow(16, index++);
                }
                System.out.println(result);*/
                
                System.out.println(conversion(s.substring(2)));
            }
            input.close();
        }public static int conversion(String s) {
            int n = 0;
            int count = 0;
            int temp = 0;
            char ch;
    
            while (count < s.length()) {
                ch = s.charAt(s.length() - count - 1);
                if (ch >= '0' && ch <= '9') {
                    temp = ch - '0';
                } else if (ch >= 'A' && ch <= 'Z') {
                    temp = ch - 'A' + 10;
                } else if (ch >= 'a' && ch <= 'z') {
                    temp = ch - 'a' + 10;
                } else {
                    break;
                }
                n += temp * Math.pow(16, count);
                count++;
            }
    
            return n;
        }
    }

    6.质数因子

    功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(如180的质因子为2 2 3 3 5 )

    最后一个数后面也要有空格

    输入描述:

    输入一个long型整数

    输出描述:

    按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。

    示例1

    输入

    180
    

    输出

    2 2 3 3 5

    import java.util.Scanner;
    
    /**
     * 功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )最后一个数后面也要有空格
     */
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            Long number = input.nextLong();
            if (number < 2) {
                input.close();
                return;
            }
            isPrimeFactors(number);
            input.close();
    
        }
    
        public static void isPrimeFactors(Long number) {
            while (number != 1) {
                for (int i = 2; i <= number; i++) {
                    if (number % i == 0) {
                        number = number / i;
                        System.out.print(i + " ");
                        break;
                    }
                }
            }
        }
    }

    7.四舍五入

    写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。

    输入描述:

    输入一个正浮点数值

    输出描述:

    输出该数值的近似整数值

    示例1

    输入

    5.5
    

    输出

    6
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            double number = input.nextDouble();
            int res = round(number);
            System.out.println(res);
            input.close();
        }
    
        public static int round(double number) {
            int res = (int) number;
            return (number - res) >= 0.5 ? res + 1 : res;
        }
    }

    8.对表索引相同的记录进行合并

    数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

    输入描述:

    先输入键值对的个数
    然后输入成对的index和value值,以空格隔开

    输出描述:

    输出合并后的键值对(多行)

    示例1

    输入

    4
    0 1
    0 2
    1 2
    3 4
    

    输出

    0 3
    1 2
    3 4
    import java.util.Scanner;
    import java.util.TreeMap;
    
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            int num = Integer.parseInt(input.nextLine());
    
            TreeMap<Integer, Integer> map = new TreeMap<>();
            for (int i = 0; i < num; i++) {
                String s = input.nextLine();
                getResult(s, map);
            }
    
            for (Integer key : map.keySet()) {
                System.out.println(key + " " + map.get(key));
            }
    
        }
    
        public static void getResult(String s, TreeMap<Integer, Integer> map) {
            String[] arr = s.split(" ");
            int key = Integer.parseInt(arr[0]);
            int value = Integer.parseInt(arr[1]);
            if (map.containsKey(key)) {
                value += map.get(key);
                map.put(key, value);
            } else {
                map.put(key, value);
            }
        }
    
    }

    9.提取不重复的整数

    输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。

    输入描述:

    输入一个int型整数

    输出描述:

    按照从右向左的阅读顺序,返回一个不含重复数字的新的整数

    示例1

    输入

    9876673

    输出

    37689

    import java.util.LinkedHashSet;
    import java.util.Scanner;
    
    public class T09提取不重复的整数 {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            String s = input.nextLine();
            LinkedHashSet<Character> set = new LinkedHashSet<>();
            for (int i = s.length() - 1; i >= 0; i--) {
                char ch = s.charAt(i);
                set.add(ch);
            }
            for (Character ch : set) {
                System.out.print(ch);
            }
            input.close();
        }
    
    }

    10.统计字符个数

    编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里。不在范围内的不作统计。

    输入描述:

    输入N个字符,字符在ACSII码范围内。

    输出描述:

    输出范围在(0~127)字符的个数。

    示例1

    输入

    abc

    输出

    3
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            String s = input.nextLine();
            int count = 0;
            int[] arr = new int[128];
            for (int i = 0; i < s.length(); i++) {
                if (arr[s.charAt(i)] == 0) {
                    arr[s.charAt(i)]++;
                }
            }
            for (int i = 0; i < arr.length; i++) {
                if (arr[i] != 0) {
                    count++;
                }
            }
            System.out.println(count);
        }
    
    }

    11.按照字典的顺序排列字符串

    给定n个字符串,请对n个字符串按照字典序排列。

    输入描述:

    输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。

    输出描述:

    数据输出n行,输出结果为按照字典序排列的字符串。
    示例1

    输入

    9
    cap
    to
    cat
    card
    two
    too
    up
    boat
    boot

    输出

    boat
    boot
    cap
    card
    cat
    to
    too
    two
    up

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            int num = Integer.parseInt(input.nextLine());
            ArrayList<String> list = new ArrayList<>();
            for (int i = 0; i < num; i++) {
                String s = input.nextLine();
                list.add(s);
            }
            Collections.sort(list);
            for (String s : list) {
                System.out.println(s);
            }
            input.close();
        }
    
    }

    12.密码验证合格程序

    密码要求:

    1.长度超过8位

    2.包括大小写字母.数字.其它符号,以上四种至少三种

    3.不能有相同长度超2的子串重复

    说明:长度超过2的子串

    输入描述:

    一组或多组长度超过2的子符串。每组占一行

    输出描述:

    如果符合要求输出:OK,否则输出NG

    示例1

    输入

    021Abc9000
    021Abc9Abc1
    021ABC9000
    021$bc9000
    

    输出

    OK
    NG
    NG
    OK
    import java.util.Scanner;
    import java.util.regex.Pattern;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                String str = input.nextLine();
                String res = isPassword(str);
                System.out.println(res);
            }
    
        }
    
        public static String isPassword(String str) {
            //1.判断长度
            if (str == null || str.length() < 9) {
                return "NG";
            }
    
            int count = 0;
            //2.判断是否含有三种以上字符
            /*Pattern p1 = Pattern.compile("[a-z]");
            Matcher m1 = p1.matcher(str);
            if (m1.find())
                count++;
            Pattern p2 = Pattern.compile("[A-Z]");
            Matcher m2 = p2.matcher(str);
            if (m2.find())
                count++;
            Pattern p3 = Pattern.compile("[0-9]");
            Matcher m3 = p3.matcher(str);
            if (m3.find())
                count++;
            
            Pattern p4 = Pattern.compile("[^a-zA-Z0-9]");
            Matcher m4 = p4.matcher(str);
            if (m4.find())
                count++;*/
            if (Pattern.matches(".*[a-z]+.*", str)) //+表达式至少出现1次,相当于 {1,}
                count++;
            if (Pattern.matches(".*[A-Z]+.*", str)) //*表达式至少出现0次,表达式不出现或出现任意次,相当于 {0,}
                count++;
            if (Pattern.matches(".*[0-9]+.*", str)) //.小数点可以匹配任意一个字符(除了换行符)
                count++;
            if (Pattern.matches(".*[^a-zA-Z0-9]+.*", str))
                count++;
    
            if (count < 3) {
                return "NG";
    
            } else {
                return isHasSubString(str);
            }
        }
    
        private static String isHasSubString(String str) {
            for (int i = 0; i < str.length() - 3; i++) {
                String str1 = str.substring(i, i + 3);
                String str2 = str.substring(i + 3);
                if (str2.contains(str1))
                    return "NG";
            }
            return "OK";
        }
    }

    13.密码转换

    大家都知道手机上的字母: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0,就这么简单,渊子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,

    声明:密码中没有空格,而密码中出现的大写字母则变成小写之后往后移一位,如:X,先变成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。

    输入描述:

    输入包括多个测试数据。输入是一个明文,密码长度不超过100个字符,输入直到文件结尾

    输出描述:

    输出渊子真正的密文

    示例1

    输入

    YUANzhi1987

    输出

    zvbo9441987
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                String str = input.nextLine();
                char[] arr = str.toCharArray();
                for (int i = 0; i < arr.length; i++) {
                    char num = arr[i];
                    if (num >= '0' && num <= '9') {
                        continue;
                    } else if ("abc".contains(num + "")) {
                        arr[i] = '2';
                    } else if ("def".contains(num + "")) {
                        arr[i] = '3';
                    } else if ("ghi".contains(num + "")) {
                        arr[i] = '4';
                    } else if ("jkl".contains(num + "")) {
                        arr[i] = '5';
                    } else if ("mno".contains(num + "")) {
                        arr[i] = '6';
                    } else if ("pqrs".contains(num + "")) {
                        arr[i] = '7';
                    } else if ("tuv".contains(num + "")) {
                        arr[i] = '8';
                    } else if ("wxyz".contains(num + "")) {
                        arr[i] = '9';
                    } else if (num>='A' && num<='Y') {
                        arr[i] = (char) (num + 33);
                    } else if (num =='Z') {
                        arr[i] = 'a';
                    } else{
                        System.out.println("your password is error!");
                        return;
                    }
                }
                for (char c : arr) {
                    System.out.print(c);
                }
            }
        }
    
    }

    14.删除出现次数最少的字符

    实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。
    注意每个输入文件有多组输入,即多个字符串用回车隔开

    输入描述:

    字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。

    输出描述:

    删除字符串中出现次数最少的字符后的字符串。

    示例1

    输入

    abcdd

    输出

    dd
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Scanner;
    import java.util.TreeMap;
    
    
    public class Main {
    
        /*public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                String s = input.nextLine();
                Map<Character, Integer> map = new TreeMap<>();
                for (int i = 0; i < s.length(); i++) {
                    char key = s.charAt(i);
                    if (map.containsKey(key)) {
                        map.put(key, map.get(key) + 1);
                    } else {
                        map.put(key, 1);
                    }
                }
        
                List<Map.Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());
                Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
                    @Override
                    public int compare(Entry<Character, Integer> o1, Entry<Character, Integer> o2) {
                        return o1.getValue() - o2.getValue();
                    }
                });
                String newS = s.replace(list.get(0).getKey() + "", "");
                for (int i = 1; i < list.size(); i++) {
                    if (list.get(0).getValue() == list.get(i).getValue()) {
                        newS = newS.replace(list.get(i).getKey() + "", "");
                    }else {
                        break;
                    }
                }
                System.out.println(newS);
            }
            input.close();
        }*/
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                String str = input.nextLine();
                int[] count = new int[26];
                char[] chs = str.toCharArray();
                int min = Integer.MAX_VALUE;
                for (int i = 0; i < chs.length; i++) {
                    count[chs[i] - 'a']++;
                    min = min > count[chs[i] - 'a'] ? count[chs[i] - 'a'] : min;
                }
                for (int i = 0; i < count.length; i++) {
                    if (count[i] == min) {
                        str = str.replaceAll(String.valueOf((char) (i + 'a')), "");
                    }
                }
                System.out.println(str);
            }
            input.close();
        }
    }

    15.蛇形矩阵

    蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

    样例输入

    5

    样例输出

    1 3 6 10 15

    2 5 9 14

    4 8 13

    7 12

    11

    import java.util.Scanner;
    
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                int N = Integer.parseInt(input.nextLine());
                int[][] m = new int[N][N];
                m[0][0] = 1; //核心思想,后一项与前一项的关系
                System.out.print(m[0][0] + " ");
                for (int i = 0; i < N - 1; i++) {
                    m[i + 1][0] = m[i][0] + i + 1;
                    for (int j = 0; j < N - 1 - i; j++) {
                        m[i][j + 1] = m[i][j] + j + i + 2;
                        System.out.print(m[i][j + 1] + " ");
                    }
                    System.out.print("
    " + m[i + 1][0] + " ");
                }
                System.out.println(); //注意在每个测试用例后添加换行
            }
            input.close();
        }
    }

    16.顺时针打印矩阵

    package nowcode;
    
    
    /**
     * 顺时针打印矩阵
     *     输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,
     *     例如,如果输入如下4 X 4矩阵:
     *          1  2  3  4 
     *          5  6  7  8 
     *          9 10 11 12 
     *          13 14 15 16 
     *     则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
     */
    public class T22printMatrixInCircle {
    
        public static void main(String[] args) {
            int[][] m = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } };
            int rows = m.length;
            int cols = m[0].length;
            int start = 0;
            while (cols > 2 * start && rows > 2 * start) {
                pringMatrixInCircle(m, rows, cols, start);
                start++;
            }
        }
    
        public static void pringMatrixInCircle(int[][] m, int rows, int cols, int start) {
            //1.从左到右打印
            for (int j = start; j < cols - start; j++) {
                System.out.print(m[start][j] + " ");
            }
    
            //2.从上到下
            for (int i = start + 1; i < rows - start; i++) {
                System.out.print(m[i][cols - start - 1] + " ");
            }
    
            //3.从右到左
            for (int j = cols - start - 2; j >= start; j--) {
                System.out.print(m[rows - start - 1][j] + " ");
            }
    
            //4.从下到上
            for (int i = rows - start - 2; i > start; i--) {
                System.out.print(m[i][start] + " ");
            }
        }
    }

    17.字符串加密

    package nowcode;
    
    import java.util.LinkedHashSet;
    import java.util.Scanner;
    import java.util.Set;
    
    /**
     * 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,其余几个丢弃。现在,修改过的那个单词属于字母表的下面,如下所示:
        A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
        T R A I L B Z E S C D F G H J K M N O P Q U V W X Y
        上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙,Attack AT DAWN(黎明时攻击)就会被加密为Tpptad TP ITVH。
        通过指定的密匙和明文得到密文。
        
        输入描述:
        先输入key和要加密的字符串
        
        输出描述:
        返回加密后的字符串
        
        示例1
        输入
        nihao
        ni
        输出
        le
     */
    public class T23字符串加密 {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            String s1 = "abcdefghijklmnopqrstuvwxyz";
            while (input.hasNext()) {
                StringBuffer sb = new StringBuffer(s1);
                String str = input.nextLine();
                String data = input.nextLine();
                String disStr = getDistinctString(str);
                //            System.out.println(disStr);
    
                String key = completion(sb, disStr);
                //            System.out.println(key);
                String result = getPlainText(key, data);
                System.out.println(result);
            }
        }
    
        /**
         * 字符串去重
         */
        public static String getDistinctString(String s) {
            Set<Character> set = new LinkedHashSet<>();
            for (int i = 0; i < s.length(); i++) {
                set.add(s.charAt(i));
            }
            String res = "";
            for (Character ch : set) {
                res += ch;
            }
            return res;
        }
    
        /**
         * 字符串补齐
         * @param sb:标准字符串
         * @param str:去重之后的字符串
         * @return 
         */
        public static String completion(StringBuffer sb, String str) {
            //int index = 0;
            for (int i = 0; i < str.length(); i++) {
                char ch = str.charAt(i);
    
                sb.deleteCharAt(sb.indexOf(ch + ""));
                //sb.insert(index++, ch);
            }
            return str + sb.toString();
        }
    
        /**
         * 得到明文
         * @param key:密钥
         * @param data:加密的数据
         * @return
         */
        public static String getPlainText(String key, String data) {
            String res = "";
            for (int i = 0; i < data.length(); i++) {
                char ch = data.charAt(i);
                if (Character.isLowerCase(ch)) {
                    res += key.charAt(ch - 'a');
                } else if (Character.isUpperCase(ch)) {
                    res += (char) (key.charAt(ch - 'A') - 32);
                } else {
                    System.out.println("wrong");
                    return null;
                }
            }
            return res;
        }
    }

    18.最长递增子序列

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                String str = input.nextLine();
                String[] arr = str.split(" ");
                int[] nums = new int[arr.length];
                for (int i = 0; i < nums.length; i++) {
                    nums[i] = Integer.parseInt(arr[i]);
                }
                int res = getMaxLengthOfSubsequence(nums);
                System.out.println(res);
            }
            input.close();
        }
    
        //获得最长子序列
        public static int getMaxLengthOfSubsequence(int[] nums) {
            int n = nums.length;
            int[] ls = new int[n];
            int res = 1;
    
            for (int i = 0; i < n; i++) {//填充ls
                int maxValue = 1;
                ls[i] = 1;
                for (int j = 0; j < i; j++) { ///遍历所有的A
                    if (nums[i] > nums[j]) {
                        maxValue = max(maxValue, ls[j] + 1);
                    }
                    ls[i] = maxValue;
                }
            }
    
            int index = 0;
            //最长子序列末尾出现的位置
            for (int i = 0; i < n; i++) { //查找最大的子序列
                if (ls[i] > res) {
                    res = ls[i];
                    index = i;
                }
            }
            
            int count = res; //从后往前找子序列
            int[] arrRes = new int[count];
            arrRes[--count] = nums[index];
            for (int i = index; i >= 0; i--) {
                if (nums[i] < nums[index] && ls[i] == ls[index] - 1) {
                    arrRes[--count] = nums[i];
                    index = i;
                }
            }
    
            System.out.println(Arrays.toString(arrRes));
            return res;
        }
    
        public static int max(int a, int b) {
            return a > b ? a : b;
        }
    
    }

    19.合唱队

    package nowcode2;
    
    import java.util.Arrays;
    import java.util.Scanner;
    
    /**
     * 计算最少出列多少位同学,使得剩下的同学排成合唱队形
        说明:
        N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。 
        合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,   则他们的身高满足存在i(1<=i<=K)使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK。 
        你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。 
        
        输入描述:
        整数N
        
        输出描述:
        最少需要几位同学出列
        
        示例1
        输入
        8
        186 186 150 200 160 130 197 200
        输出
        4
     */
    public class T25合唱队 {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                int num = Integer.parseInt(input.nextLine());
                String str = input.nextLine();
                String[] snum = str.split(" ");
                int[] nums = new int[num];
                for (int i = 0; i < num; i++) {
                    nums[i] = Integer.parseInt(snum[i]);
                }
    
                int[] l1 = new int[num];
                int[] l2 = new int[num];
    
                int res = getMaxLenOfSubsequence(nums, l1, l2, num);
                System.out.println(res);
            }
            input.close();
        }
    
        public static int getMaxLenOfSubsequence(int[] nums, int[] l1, int[] l2, int num) {
            // 核心思想:动态规划 li = max(lj) +1,其中  0 <= j <i。
            for (int i = 0; i < num; i++) {//由左向右遍历
                l1[i] = 1;
                for (int j = 0; j < i; j++) { 
                    if (nums[i] > nums[j] && l1[i] < l1[j] + 1) {
                        l1[i] = l1[j] + 1;
                    }
                }
            }
            for (int i = num - 1; i >= 0; i--) { //从右向左遍历
                l2[i] = 1;
                for (int j = i + 1; j < num; j++) {
                    if (nums[i] > nums[j] && l2[i] < l2[j] + 1) {
                        l2[i] = l2[j] + 1;
                    }
                }
            }
    
            int res = 0;
            for (int i = 0; i < num; i++) {
                if (res < l1[i] + l2[i] - 1) {
                    res = l1[i] + l2[i] - 1;
                }
            }
            return num - res;
        }
    }

    20.数据分类处理

    输入描述:

    一组输入整数序列I和一组规则整数序列R,I和R序列的第一个整数为序列的个数(个数不包含第一个整数);整数范围为0~0xFFFFFFFF,序列个数不限

    输出描述:

    从R依次中取出R<i>,对I进行处理,找到满足条件的I<j>: 

    I<j>整数对应的数字需要连续包含R<i>对应的数字。比如R<i>为23,I<j>为231,那么I<j>包含了R<i>,条件满足 。 

    按R<i>从小到大的顺序:

    (1)先输出R<i>; 

    (2)再输出满足条件的I<j>的个数; 

    (3)然后输出满足条件的I<j>在I序列中的位置索引(从0开始); 

    (4)最后再输出I<j>。 

    附加条件: 

    (1)R<i>需要从小到大排序。相同的R<i>只需要输出索引小的以及满足条件的I<j>,索引大的需要过滤掉 

    (2)如果没有满足条件的I<j>,对应的R<i>不用输出 

    (3)最后需要在输出序列的第一个整数位置记录后续整数序列的个数(不包含“个数”本身)

    序列I:15,123,456,786,453,46,7,5,3,665,453456,745,456,786,453,123(第一个15表明后续有15个整数) 

    序列R:5,6,3,6,3,0(第一个5表明后续有5个整数) 

    输出:30, 3,6,0,123,3,453,7,3,9,453456,13,453,14,123,6,7,1,456,2,786,4,46,8,665,9,453456,11,456,12,786

    说明:

    30----后续有30个整数

    3----从小到大排序,第一个R<i>为0,但没有满足条件的I<j>,不输出0,而下一个R<i>是3

    6--- 存在6个包含3的I<j> 

    0--- 123所在的原序号为0 

    123--- 123包含3,满足条件 

    示例1

    输入

    15 123 456 786 453 46 7 5 3 665 453456 745 456 786 453 123
    5 6 3 6 3 0

    输出

    30 3 6 0 123 3 453 7 3 9 453456 13 453 14 123 6 7 1 456 2 786 4 46 8 665 9 453456 11 456 12 786
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.LinkedHashSet;
    import java.util.Scanner;
    import java.util.Set;
    import java.util.TreeSet;
    
    public class Main {
        /*
            public static void main(String[] args) {
                Scanner input = new Scanner(System.in);
                while (input.hasNext()) {
                    String I = input.nextLine();
                    String[] sarrI = I.substring(I.indexOf(" ") + 1).split(" ");
                    String R = input.nextLine();
                    String[] sarrR = R.substring(R.indexOf(" ") + 1).split(" ");
                    int[] arrR = new int[sarrR.length];
                    for (int i = 0; i < sarrR.length; i++) {
                        arrR[i] = Integer.parseInt(sarrR[i]);
                    }
                    //            System.out.println(Arrays.toString(sarrI));
                    //            System.out.println(Arrays.toString(arrR));
        
                    ArrayList<String> listR = sortAndDistinct(arrR);
                    //            System.out.println(Arrays.toString(arrR));
                    ArrayList<Integer> listRes = new ArrayList();
        //            System.out.println(listR);
                    
                    for (int i = 0; i < listR.size(); i++) {
                        listRes.add(Integer.parseInt(listR.get(i)));
                        ArrayList<String> listNums = new ArrayList<>();
                        ArrayList<Integer> listIndexs = new ArrayList<>();
                        for (int j = 0; j < sarrI.length; j++) {
                            if (sarrI[j].contains(listR.get(i))) {
                                listNums.add(sarrI[j]);
                                listIndexs.add(j);
                            }
                        }
                        
                        if(listNums.size()== 0) {
                            listRes.remove(listRes.size()-1); 
                            continue;
                        }
                        
                        listRes.add(listNums.size());
                        
                        for(int k = 0; k< listNums.size();k++) {
                            listRes.add(listIndexs.get(k));
                            listRes.add(Integer.parseInt(listNums.get(k)));
                        }
                    }
                    
                    System.out.print(listRes.size()+" ");
                    for (Integer val :listRes ) {
                        System.out.print(val + " ");
                    }
        
                }
                input.close();
            }
        
            public static ArrayList<String> sortAndDistinct(int[] arr) {
                Arrays.sort(arr);
                LinkedHashSet<Integer> set = new LinkedHashSet<>();
                for (int i = 0; i < arr.length; i++) {
                    set.add(arr[i]);
                }
        
                ArrayList<String> list = new ArrayList<>();
                for (Integer i : set) {
                    list.add(String.valueOf(i));
                }
                return list;
            }*/
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                String strI = input.nextLine();
                String strR = input.nextLine();
                String res = fun(strI, strR);
                System.out.println(res);
            }
            input.close();
        }
    
        public static String fun(String strI, String strR) {
            String[] arrI = strI.split(" ");
            String[] arrR = strR.split(" ");
    
            Set<Integer> setR = new TreeSet<>(); //有序的无重复数字可以用TreeSet
            for (int i = 1; i < arrR.length; i++) {
                setR.add(Integer.parseInt(arrR[i]));
            }
    
            StringBuffer result = new StringBuffer();
    
            for (int rdata : setR) {
                int num = 0;
                StringBuffer sb = new StringBuffer();
    
                for (int i = 1; i < arrI.length; i++) {
                    if (arrI[i].contains(String.valueOf(rdata))) {
                        num++;
                        sb.append((i - 1) + " ");
                        sb.append(arrI[i] + " ");
                    }
                }
    
                if (num != 0) {
                    result.append(rdata + " ");
                    result.append(num + " ");
                    result.append(sb);
                }
            }
            int all_num = result.toString().split(" ").length;
            result.insert(0, (all_num) + " ");
            return result.toString();
        }
    }

    21.字符串排序

    package nowcode2;
    
    import java.util.Arrays;
    import java.util.Scanner;
    
    /**
     * 题目描述
        编写一个程序,将输入字符串中的字符按如下规则排序。
        规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
        如,输入: Type 输出: epTy
        规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
        如,输入: BabA 输出: aABb
        规则 3 :非英文字母的其它字符保持原来的位置。
        如,输入: By?e 输出: Be?y
        
        输入描述:
        输入字符串
        输出描述:
        输出字符串
        示例1
        输入
        A Famous Saying: Much Ado About Nothing (2012/8).
        输出
        A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
     */
    public class T27字符串排序 {
    
        /*public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                String str = input.nextLine();
                char[] data = str.toCharArray();
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < data.length; i++) {
                    char ch = data[i];
                    if (Character.isLetter(ch)) {
                        sb.append(ch);
                    }
                }
                char[] sarr = sb.toString().toCharArray();
                getSortString(sarr);
        
                int index = 0;
                for (int i = 0; i < data.length; i++) {
                    if (Character.isLetter(data[i])) {
                        System.out.print(sarr[index++]);
                    } else {
                        System.out.print(data[i]);
                    }
                }
                System.out.println();
            }
            input.close();
        }
        
        public static void getSortString(char[] sarr) {
            char temp = '*';
            for (int i = 0; i < sarr.length - 1; i++) {
                for (int j = sarr.length - 1; j > i; j--) {
                    if (Character.toUpperCase(sarr[j - 1]) > Character.toUpperCase(sarr[j])) { //前面的字母比后面的字母小
                        temp = sarr[j - 1];
                        sarr[j - 1] = sarr[j];
                        sarr[j] = temp;
                    } 
                }
            }
        }*/
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            while (input.hasNext()) {
                String str = input.nextLine();
                //            char[] arr = str.toCharArray();
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < 26; i++) {
                    char ch = (char) (i + 'A');
                    for (int j = 0; j < str.length(); j++) {
                        if (ch == str.charAt(j) || ch == str.charAt(j) - 32) {
                            sb.append(str.charAt(j));
                        }
                    }
                }
    
                for (int i = 0; i < str.length(); i++) {
                    if (!Character.isLetter(str.charAt(i))) {
                        sb.insert(i, str.charAt(i));
                    }
                }
                System.out.println(sb.toString());
            }
            input.close();
        }
    }

    22.查找兄弟单词

    package nowcode2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class T28FindBrotherWords {
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String s = null;
            while ((s = br.readLine()) != null) {
                String[] vals = s.split(" ");
                if (vals.length < 4)
                    continue;
                int num = Integer.parseInt(vals[0]);
                if (num > 1000)
                    continue;
                String key = vals[num + 1];
                int index = Integer.parseInt(vals[num + 2]);
                List<String> list = new ArrayList<String>();
                for (int i = 1; i <= num; i++) {
                    if (isBrothStr(vals[i], key)) {
                        list.add(vals[i]);
                    }
                }
                Collections.sort(list);
                System.out.println(list.size());
                if (list.size() >= index)
                    System.out.println(list.get(index - 1));
            }
        }
    
        public static boolean isBrothStr(String source, String dest) {
            if (source.equals(dest) || source.length() != dest.length())
                return false;
    
            for (int i = 'a'; i <= 'z'; i++) {
                char ch = (char) i;
                if (getCharSize(source, ch) != getCharSize(dest, ch))
                    return false;
            }
            return true;
            /*List<Character> list1 = new ArrayList<>();
            List<Character> list2 = new ArrayList<>();
            for (int i = 0; i < source.length(); i++) {
                list1.add(source.charAt(i));
                list2.add(dest.charAt(i));
            }
            System.out.println("list1:" + list1);
            System.out.println("list2:" + list2);
            return list1.containsAll(list2); // containsAll方法不能比较两个list是否相等,
                                                //反例:list1:[a, b, c, b]和list2:[a, c, a, b]也是true
            */
    
        }
    
        public static int getCharSize(String source, char ch) {
            int count = 0;
            for (int i = 0; i < source.length(); i++)
                if (source.charAt(i) == ch)
                    count++;
            return count;
        }
    
    }

    23.字符串加密

    package nowcode2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    /**
     * 题目描述
        1、对输入的字符串进行加解密,并输出。
        2加密方法为:
        当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
        当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
        其他字符不做变化。
        3、解密方法为加密的逆过程。
        
        说明:
        1、字符串以结尾。
        2、字符串最长100个字符。
        说明:
        
        1、字符串以结尾。
        2、字符串最长100个字符。
            
        输入描述:
        输入说明
        输入一串要加密的密码
        输入一串加过密的密码
        
        输出描述:
        输出说明
        输出加密后的字符
        输出解密后的字符
        
        示例1
        输入
        abcdefg
        BCDEFGH
        输出
        BCDEFGH
        abcdefg
     */
    public class T30StringEncrption {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String str = "";
            while ((str = br.readLine()) != null) {
                String s1 = str;
                String s2 = br.readLine();
    
                String res1 = encrption(s1);
                System.out.println(res1);
                String res2 = decrption(s2);
                System.out.println(res2);
            }
        }
    
        public static String encrption(String s) {
            char[] arr = s.toCharArray();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < arr.length; i++) {
                if (arr[i] >= 'a' && arr[i] < 'z') {
                    sb.append((char) (arr[i] - 31));
                } else if (arr[i] == 'z') {
                    sb.append('A');
                } else if (arr[i] >= 'A' && arr[i] < 'Z') {
                    sb.append((char) (arr[i] + 33));
                } else if (arr[i] == 'Z') {
                    sb.append('a');
                } else if (arr[i] >= '0' && arr[i] < '9') {
                    sb.append((char) (arr[i] + 1));
                } else if (arr[i] == '9') {
                    sb.append('0');
                }
            }
            return sb.toString();
        }
    
        public static String decrption(String s) {
            char[] arr = s.toCharArray();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < arr.length; i++) {
    
                if (arr[i] > 'a' && arr[i] <= 'z') {
                    sb.append((char) (arr[i] - 33));
                } else if (arr[i] == 'a') {
                    sb.append('Z');
                } else if (arr[i] > 'A' && arr[i] <= 'Z') {
                    sb.append((char) (arr[i] + 31));
                } else if (arr[i] == 'A') {
                    sb.append('z');
                } else if (arr[i] > '0' && arr[i] <= '9') {
                    sb.append((char) (arr[i] - 1));
                } else if (arr[i] == '0') {
                    sb.append('9');
                }
            }
            return sb.toString();
        }
    }

    24.字符串加密

    package nowcode2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    /**
     * 题目描述
        1、对输入的字符串进行加解密,并输出。
        2加密方法为:
        当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
        当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
        其他字符不做变化。
        3、解密方法为加密的逆过程。
        
        说明:
        1、字符串以结尾。
        2、字符串最长100个字符。
        说明:
        
        1、字符串以结尾。
        2、字符串最长100个字符。
            
        输入描述:
        输入说明
        输入一串要加密的密码
        输入一串加过密的密码
        
        输出描述:
        输出说明
        输出加密后的字符
        输出解密后的字符
        
        示例1
        输入
        abcdefg
        BCDEFGH
        输出
        BCDEFGH
        abcdefg
     */
    public class T30StringEncrption {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String str = "";
            while ((str = br.readLine()) != null) {
                String s1 = str;
                String s2 = br.readLine();
    
                String res1 = encrption(s1);
                System.out.println(res1);
                String res2 = decrption(s2);
                System.out.println(res2);
            }
        }
    
        public static String encrption(String s) {
            char[] arr = s.toCharArray();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < arr.length; i++) {
                if (arr[i] >= 'a' && arr[i] < 'z') {
                    sb.append((char) (arr[i] - 31));
                } else if (arr[i] == 'z') {
                    sb.append('A');
                } else if (arr[i] >= 'A' && arr[i] < 'Z') {
                    sb.append((char) (arr[i] + 33));
                } else if (arr[i] == 'Z') {
                    sb.append('a');
                } else if (arr[i] >= '0' && arr[i] < '9') {
                    sb.append((char) (arr[i] + 1));
                } else if (arr[i] == '9') {
                    sb.append('0');
                }
            }
            return sb.toString();
        }
    
        public static String decrption(String s) {
            char[] arr = s.toCharArray();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < arr.length; i++) {
    
                if (arr[i] > 'a' && arr[i] <= 'z') {
                    sb.append((char) (arr[i] - 33));
                } else if (arr[i] == 'a') {
                    sb.append('Z');
                } else if (arr[i] > 'A' && arr[i] <= 'Z') {
                    sb.append((char) (arr[i] + 31));
                } else if (arr[i] == 'A') {
                    sb.append('z');
                } else if (arr[i] > '0' && arr[i] <= '9') {
                    sb.append((char) (arr[i] - 1));
                } else if (arr[i] == '0') {
                    sb.append('9');
                }
            }
            return sb.toString();
        }
    }

    25.小球弹落

    package nowcode2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    /**
     * 假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高? 
        输入描述:
        输入起始高度,int型
        输出描述:
        分别输出第5次落地时,共经过多少米第5次反弹多高
        
        示例1
        输入
        1
        输出
        2.875
        0.03125
    */
    public class T39BallRebounce {
        public static void main(String[] args) throws IOException {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            String str = null;
            while ((str = bf.readLine()) != null) {
                double h = Double.parseDouble(str);
                double sum = h;
                h = h / 2;
                int times = 5;
                for (int i = 1; i < times; i++) {
                    sum += h * 2;
                    h = h / 2;
                }
                System.out.println(String.format("%.0f", sum));
                System.out.println(String.format("%.2f", h));
            }
        }
    }

    26.砝码称重

    package nowcode2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    /**
     * 题目描述
        现有一组砝码,重量互不相等,分别为m1,m2,m3…mn;
        每种砝码对应的数量为x1,x2,x3...xn。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。
        
        注:
        称重重量包括0
        方法原型:public static int fama(int n, int[] weight, int[] nums)
        
        输入描述:
        输入包含多组测试数据。
        对于每组测试数据:
        第一行:n --- 砝码数(范围[1,10])
        第二行:m1 m2 m3 ... mn --- 每个砝码的重量(范围[1,2000])
        第三行:x1 x2 x3 .... xn --- 每个砝码的数量(范围[1,6])
        输出描述:
        利用给定的砝码可以称出的不同的重量数
        
        示例1
        输入
        2
        1 2
        2 1
        输出
        5
    */
    public class T41砝码 {
        public static void main(String[] args) throws IOException {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            String str = null;
            while ((str = bf.readLine()) != null) {
                int n = Integer.parseInt(str);
                int[] weight = new int[n];
                int[] nums = new int[n];
    
                String[] sarrw = bf.readLine().split(" ");
                String[] sarrn = bf.readLine().split(" ");
                for (int i = 0; i < n; i++) {
                    weight[i] = Integer.parseInt(sarrw[i]);
                    nums[i] = Integer.parseInt(sarrn[i]);
                }
                System.out.println(fama(n, weight, nums));
            }
        }
    
        private static int fama(int n, int[] weight, int[] nums) {
            // TODO Auto-generated method stub
            int maxWeight = 0;
            //所有砝码能够表示的最大重量
            for (int i = 0; i < n; i++) {//砝码的种类数
                maxWeight = maxWeight + nums[i] * weight[i];
            }
            boolean[] wflag = new boolean[maxWeight + 1];
            wflag[0] = true;//默认重量为0也是可以表示的
            wflag[maxWeight] = true;
            for (int i = 0; i < n; i++) {//砝码的种类数
                for (int j = 0; j < nums[i]; j++) {//每种砝码的个数
                    for (int k = maxWeight; k >= weight[i]; k--) {//每种砝码的单个重量
                        if (wflag[k - weight[i]]) {
                            wflag[k] = true;
                        }
                    }
                }
            }
            int count = 0;
            for (boolean b : wflag) {
                if (b)
                    count++;
            }
            return count;
        }
    }

    27.走迷宫

    package nowcode2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    import tool.*;
    /**
     * 题目描述
        定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: 
        int maze[5][5] = {
                0, 1, 0, 0, 0,
                0, 1, 0, 1, 0,
                0, 0, 0, 0, 0,
                0, 1, 1, 1, 0,
                0, 0, 0, 1, 0,
        };
        它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。
        Input
        一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
        Output
        左上角到右下角的最短路径,格式如样例所示。
        
        输入描述:
        输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
        
        输出描述:
        左上角到右下角的最短路径,格式如样例所示。
        
        示例1
        输入
        5 5
        0 1 0 0 0
        0 1 0 1 0
        0 0 0 0 0
        0 1 1 1 0
        0 0 0 1 0
        输出
        (0,0)
        (1,0)
        (2,0)
        (2,1)
        (2,2)
        (2,3)
        (2,4)
        (3,4)
        (4,4)
     */
    public class T42走迷宫 {
        public static void main(String[] args) throws IOException {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            String str = null;
            while ((str = bf.readLine()) != null) {
                String[] sarr = str.split(" ");
                int N = Integer.parseInt(sarr[0]);
                int M = Integer.parseInt(sarr[1]);
                //System.out.println(N + " " + M);
                int[][] matrix = new int[N][M];
                for (int i = 0; i < N; i++) {
                    String[] arr1 = bf.readLine().split(" ");
                    for (int j = 0; j < M; j++) {
                        matrix[i][j] = Integer.parseInt(arr1[j]);
                    }
                }
                //Tookit.printArray(matrix);
                findShortestPath(matrix);
            }
        }
    
        public static void findShortestPath(int[][] maza) {
            //不考虑多解情况,迷宫只有一条通道
            //可以横着走或者竖着走
            int row = 0;
            int col = 0;
            while (row < maza.length) {
                while (col < maza[0].length) {
                    if (maza[row][col] == 0) { 
                        printPath(row, col);
                        col++;//
                    } else {//
                        col--;
                        row++;
                    }
                }
                row++;
                if (col == maza[0].length)
                    col--;//
            }
        }
    
        public static void printPath(int i, int j) {
            System.out.println("(" + i + "," + j + ")");
        }
    }

    28.数独

    问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个粗线宫内的数字均含1-9,并且不重复。

    输入:
    包含已知数字的9X9盘面数组[空缺位以数字0表示]
    输出:
    完整的9X9盘面数组

    输入描述:

    包含已知数字的9X9盘面数组[空缺位以数字0表示]

    输出描述:

    完整的9X9盘面数组

    示例1

    输入

    0 9 2 4 8 1 7 6 3
    4 1 3 7 6 2 9 8 5
    8 6 7 3 5 9 4 1 2
    6 2 4 1 9 5 3 7 8
    7 5 9 8 4 3 1 2 6
    1 3 8 6 2 7 5 9 4
    2 7 1 5 3 8 6 4 9
    3 8 6 9 1 4 2 5 7
    0 4 5 2 7 6 8 3 1

    输出

    5 9 2 4 8 1 7 6 3
    4 1 3 7 6 2 9 8 5
    8 6 7 3 5 9 4 1 2
    6 2 4 1 9 5 3 7 8
    7 5 9 8 4 3 1 2 6
    1 3 8 6 2 7 5 9 4
    2 7 1 5 3 8 6 4 9
    3 8 6 9 1 4 2 5 7
    9 4 5 2 7 6 8 3 1
    package nowcode2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.HashSet;
    
    import tool.*;
    
    public class T43数独 {
        public static void main(String[] args) throws IOException {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            String str = null;
            while ((str = bf.readLine()) != null) {
                int[][] matrix = new int[9][9];
                String[] sarr = str.split(" ");
                for (int j = 0; j < 9; j++) {
                    matrix[0][j] = Integer.parseInt(sarr[j]);
                }
                for (int i = 1; i < 9; i++) {
                    String[] temp = bf.readLine().split(" ");
                    for (int j = 0; j < 9; j++) {
                        matrix[i][j] = Integer.parseInt(temp[j]);
    
                    }
                }
                solveSudoku(matrix);
                Tookit.printArray(matrix);
    
            }
            bf.close();
        }
    
        static int solveSudoku(int[][] board) {
            int depth = 0;
            for (int i[] : board)
                for (int j : i)
                    if (j == 0)
                        depth++;
            return dfs(board, depth);
    
        }
    
        static int dfs(int[][] board, int depth) {
            if (depth == 0)
                return 0;
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[0].length; j++) {
                    if (board[i][j] == 0) {
                        if (board[6][0] == 2 && board[6][1] == 1 && board[6][2] == 3)
                            board[6][2] = 5;
                        for (int k = 1; k <= 10; k++) {
                            if (k == 10)
                                return depth;
                            board[i][j] = k;
                            if (!isValid(board, i, j))
                                board[i][j] = 0;
                            else {
                                depth--;
                                depth = dfs(board, depth);
                                if (depth == 0)
                                    return depth;
                                depth++;
                                board[i][j] = 0;
                            }
                        }
                    }
                }
            }
            return depth;
        }
    
        static boolean isValid(int[][] board, int row, int col) {
            boolean[] check = new boolean[10];
            for (int i = 0; i < check.length; i++)
                check[i] = true;
            for (int i = 0; i < board[0].length; i++) {
                if (check[board[row][i]])
                    check[board[row][i]] = false;
                else if (board[row][i] != 0)
                    return false;
            }
    
            for (int i = 0; i < check.length; i++)
                check[i] = true;
            for (int i = 0; i < board.length; i++) {
                if (check[board[i][col]])
                    check[board[i][col]] = false;
                else if (board[i][col] != 0)
                    return false;
            }
    
            for (int i = 0; i < check.length; i++)
                check[i] = true;
            int rowTemp = (row / 3) * 3;
            int colTemp = (col / 3) * 3;
            for (int k = 0; k < 9; k++) {
                row = rowTemp + k / 3;
                col = colTemp + k % 3;
                if (check[board[row][col]])
                    check[board[row][col]] = false;
                else if (board[row][col] != 0)
                    return false;
            }
            return true;
        }
    }

    29.括号匹配

    package nowcode2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Stack;
    
    /**
     * 给定一个字符串,其中的字符只包含三种括号:花括号{ }、中括号[ ]、圆括号( ),即它仅由 “( ) [ ] { }” 这六个字符组成。
     * 设计算法,判断该字符串是否有效,即字符串中括号是否匹配。括号匹配要求括号必须以正确的顺序配对,如 “{ [ ] ( ) }”
     * 或 “[ ( { } [ ] ) ]”或 “{brace*&^[square(round)]end}”等为正确的格式,而 “[ ( ] )” 或 “{ [ ( ) }” 或 “( { } ] )” 
     * 或“{brace*&^[square(round])end}”均为不正确的格式。
     */
    public class T44括号匹配 {
        public static void main(String[] args) throws IOException {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            String str = null;
            while ((str = bf.readLine()) != null) {
                boolean res = bracketCheck(str);
                System.out.println(res);
            }
        }
    
        private static boolean bracketCheck(String s) {
            Map<Character, Character> bracketMap = new HashMap<>();
            bracketMap.put('}', '{');
            bracketMap.put(')', '(');
            bracketMap.put(']', '[');
    
            String bracketLeft = "{([";
            String bracketRight = "}])";
    
            Stack<Character> stack = new Stack<>();
    
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                //如果是左括号
                if (bracketLeft.contains(c + "")) {
                    stack.add(c);//入栈
                    //如果是右括号
                } else if (bracketRight.contains(c + "")) {
                    //stack不为空,并且括号匹配成功
                    if (stack.size() > 0 && (stack.peek() == bracketMap.get(c))) {
                        stack.pop();//出栈
                    } else {
                        return false;
                    }
                }
            }
            return stack.size() == 0;//如果栈为空,则匹配上了
        }
    }

    30.计算器之加减乘除运算

    输入描述:

    输入一个算术表达式

    输出描述:

    得到计算结果

    示例1

    输入

    3+2*{1+2*[-4/(8-6)+7]}

    输出

    25
    package nowcode3;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Stack;
    
    public class T45计算器之加减乘除运算 {
        public static void main(String[] args) throws IOException {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            String str = null;
            while ((str = bf.readLine()) != null) {
                str = format(str);
                System.out.println(getResult(str));
            }
    
        }
    
        /**
         * 进行四则运行
         *
         * @param s 输入一个算术表达式
         * @return 表达式结果
         */
        public static int getResult(String s) {
            // 操作符栈
            Stack<Character> optchars = new Stack<>();
            // 操作数栈
            Stack<Integer> optdata = new Stack<>();
            int index = 0;
            while (index < s.length()) {
                char c = s.charAt(index);
                // 如果是数字
                if (c >= '0' && c <= '9') {
                    // 计算数字的值,可能会存在两位及以上的数字
                    int opd = 0;
                    while (index < s.length() && s.charAt(index) >= '0' && s.charAt(index) <= '9') {
                        opd = opd * 10 + (s.charAt(index) - '0'); //将字符转化成数字
                        index++;
                    }
                    optdata.add(opd); //将数字加入到操作数栈中
                }
                // 如果是操作符
                else {
                    // 如果是左括号
                    if (c == '(' || c == '[' || c == '{') {
                        optchars.add(c); //将左括号字符加入到操作符栈中
                    }
                    // 如果是右括号
                    else if (c == ')' || c == ']' || c == '}') {
                        //要同时保证optchars.peek()操作符顶端的符号不能是'('或'['或'{',防止在有些数字的输入形式是(3)+2,此处的3不能计算
                        while (!optchars.isEmpty() && optchars.peek() != '(' && optchars.peek() != '[' && optchars.peek() != '{') {
                            calculate(optchars, optdata);//计算左右括号内的两个数据的运算
                        }
                        optchars.pop(); //
                    }
                    // 如果是乘或者除
                    else if (c == '*' || c == '/') {
                        //虽然操作符是乘除,但是还要保证前面的操作符栈中不能含有括号,如果含有括号,则不能进行运算
                        while (!optchars.isEmpty() && (optchars.peek() == '*' || optchars.peek() == '/')) {
                            calculate(optchars, optdata);
                        }
                        // 操作符入栈
                        optchars.add(c);
                    } else if (c == '+' || c == '-') {
                        while (!optchars.isEmpty() && (optchars.peek() == '*' || optchars.peek() == '/' || optchars.peek() == '+'
                                || optchars.peek() == '-')) {
                            calculate(optchars, optdata);
                        }
                        // 操作符入栈
                        optchars.add(c);
                    }
                    // 处理下一个字符
                    index++;
                }
            }
            while (!optchars.isEmpty()) {
                calculate(optchars, optdata);
            }
            return optdata.pop();
        }
    
        /**
         * 求值操作,取optchars的最后一个操作符,optdata中的最后两个操作数
         * @param optchars 操作符栈
         * @param optdata 操作数栈
         */
        public static void calculate(Stack<Character> optchars, Stack<Integer> optdata) {
            // 取操作数栈中的最后一个操作符
            char opt = optchars.pop();
            // 取操作数
            int v2 = optdata.pop();
            int v1 = optdata.pop();
            // 计算
            int v = calculateTowData(v1, v2, opt);
            optdata.add(v);
        }
    
        /**
         * 将算术表达式归整,-5*3整理成0-5*3
         * @param s 算术表达式
         * @return 归整后的表达式
         */
        public static String format(String s) {
            // 去掉空格
            String t = s.replaceAll("(\s)+", "");
    
            int index = 0;
            // 对所有的减号进行处理
            while ((index = t.indexOf('-', index)) >= 0) {//String.indexOf(String str,int index)
                                                            //从index的地方开始找,返回第一次出现的索引
                if (index == 0) {// 第一个字符是负号,要规格形式要加上0
                    t = '0' + t;
                }
                // 如果不是第一个字符
                else {
                    char c = t.charAt(index - 1);//负号前面的一个字符
                    // 负号前面有括号,需要在前面加0
                    if (c == '(' || c == '[' || c == '{') {
                        t = t.substring(0, index) + '0' + t.substring(index);
                    }
                }
                index++;
            }
            return t;
        }
    
        /**
         * 计算 d1 operator d2,operator是加减乘除
         *
         * @param d1       操作数1
         * @param d2       操作数2
         * @param operator 操作符
         * @return 结果
         */
        public static int calculateTowData(int d1, int d2, char operator) {
            switch (operator) {
            case '+':
                return d1 + d2;
            case '-':
                return d1 - d2;
            case '*':
                return d1 * d2;
            case '/':
                return d1 / d2;
            default:
                // do nothing
            }
            return 0;
        }
    }

    31.名字的漂亮度

    给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
    每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
    给出多个名字,计算每个名字最大可能的“漂亮度”。 

    输入描述:

    整数N,后续N个名字

    输出描述:

    每个名称可能的最大漂亮程度

    示例1

    输入

    2
    zhangsan
    lisi
    

    输出

    192
    101
    package nowcode3;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import tool.*;
    
    public class T46计算名字的漂亮度 {
    
        /*public static void main(String[] args) throws IOException {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            String str = null;
            while ((str = bf.readLine()) != null) {
                int N = Integer.parseInt(str);
                for (int i = 0; i < N; i++) {
                    String name = bf.readLine();
                    int res = getNameBeautyDegree(name);
                    System.out.println(res);
                }
            }
        }
        
        public static int getNameBeautyDegree(String name) {
            HashMap<Character, Integer> map = new HashMap<>();
            for (int i = 0; i < name.length(); i++) {
                char c = name.charAt(i);
                if (!map.containsKey(c)) {
                    map.put(c, 1);
                } else {
                    map.put(c, map.get(c) + 1);
                }
            }
            List<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character, Integer>>(map.entrySet());
            Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
        
                @Override
                public int compare(Entry<Character, Integer> o1, Entry<Character, Integer> o2) {
                    return o2.getValue().compareTo(o1.getValue());
                }
            });
            int res = 0;
            int num = 26;
            for (Entry<Character, Integer> entry : list) {
                res += entry.getValue() * num--;
            }
            return res;
        }*/
    
        public static void main(String[] args) throws IOException {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            String str = null;
            while ((str = bf.readLine()) != null) {
                int N = Integer.parseInt(str);
                for (int i = 0; i < N; i++) {
                    String name = bf.readLine();
                    int res = getNameBeautyDegree(name);
                    System.out.println(res);
                }
            }
        }
    
        public static int getNameBeautyDegree(String s) {
            int res = 0;
            int n = 26;
            int[] arr = new int[n];
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (arr[c - 'a'] != 0) {
                    arr[c - 'a']++;
                } else {
                    arr[c - 'a'] = 1;
                }
            }
            Arrays.sort(arr);
            for (int i = arr.length - 1; i >= 0; i--) {
                if (arr[i] > 0) {
                    res += arr[i] * n--;
                }
            }
            return res;
        }
    }

    32.计算字符串的距离

    package nowcode3;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class T48计算字符串的距离 {
        public static void main(String[] args) throws IOException {
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            String str1 = null;
            while ((str1 = bf.readLine()) != null) {
                String str2 = bf.readLine();
                int res = getEditDistance(str1, str2);
                System.out.println(res);
            }
        }
    
        public static int getEditDistance(String s1, String s2) {
            int len1 = s1.length();
            int len2 = s2.length();
    
            if (len1 == 0 || len2 == 0)
                return Math.max(len1, len2);
            int[][] dp = new int[len1 + 1][len2 + 1];
            for (int i = 0; i <= len1; i++) {
                dp[i][0] = i;
            }
    
            for (int j = 0; j <= len2; j++) {
                dp[0][j] = j;
            }
    
            for (int i = 1; i <= len1; i++) {
                for (int j = 1; j <= len2; j++) {
                    if (s1.charAt(i-1) == s2.charAt(j-1)) {
                        dp[i][j] = dp[i - 1][j - 1];
                    } else {
                        dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1;
                    }
    
                }
            }
            return dp[len1][len2];
        }
    
        //三个数中的最小值
        public static int min(int a, int b, int c) {
            int temp = a < b ? a : b;
            return temp < c ? temp : c;
        }
    }

    33.对应编码

    package nowcode3;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    public class T50对应编码 {
    
        public static void main(String[] args) throws Exception {
    
            String[] S = { "Faint signals, barely perceptible", "Very weak signals", "Weak signals", "Fair signals",
                    "Fairly good signals", "Good signals", "Moderately strong signals", "Strong signals",
                    "Extremely strong signals" };
            String[] R = { "unreadable", "barely readable, occasional words distinguishable",
                    "readable with considerable difficulty", "readable with practically no difficulty",
                    "perfectly readable" };
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            String str = null;
            while ((str = bf.readLine()) != null) {
                int r = Integer.parseInt(str.charAt(0) + "");
                int s = Integer.parseInt(str.charAt(1) + "");
                System.out.println(S[s - 1] +", "+ R[r - 1]+".");
            }
        }
    
    }

    34.两数之和

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

    示例:

    给定 nums = [2, 7, 11, 15], target = 9
    
    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]
    package leecode;
    
    import java.util.HashMap;
    
    import com.sun.org.apache.regexp.internal.recompile;
    
    import tool.Tookit;
    
    public class TowSum {
        // 方法1:暴力法,两层for循环
        /*public static int[] getTowSum(int[] nums, int target) {
            for (int i = 0; i < nums.length; i++) {
                for (int j = i + 1; j < nums.length; j++) {
                    if (nums[i] + nums[j] == target) {
                        return new int[] { i, j };
                    }
                }
            }
            throw new IllegalArgumentException("No two sum solution");
        }*/
    
        // 方法2:使用HashMap快速查找
        public static int[] getTowSum(int[] nums, int target) {
            HashMap<Integer, Integer> map = new HashMap<>();
            for (int i = 0; i < nums.length; i++) {
                int competent = target - nums[i];
                if (map.containsKey(competent)) {
                    return new int[] { map.get(competent), i };
                }
                map.put(nums[i], i);
            }
            throw new IllegalArgumentException("No two sum solution");
        }
    
        public static void main(String[] args) {
            int[] nums = { 2, 7, 11, 15 };
            int target = 9;
            int[] res = getTowSum(nums, target);
            Tookit.printArray(res);
        }
    
    }

    35.两数字相加

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

    如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

    您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

    官方题解

    package leecode;
    
    class ListNode {
        int val;
        ListNode next;
    
        public ListNode(int x) {
            this.val = x;
        }
    
        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append(this.val).append("->");
    
            ListNode node = this;
            while (node.next != null) {
                node = node.next;
                sb.append(node.val);
    
                if (node.next != null) {
                    sb.append("->");
                }
            }
            return sb.toString();
        }
    }
    
    public class AddTowNumbers {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            ListNode dummyHead = new ListNode(0);// 头节点
            ListNode p1 = l1, p2 = l2;
            ListNode current = dummyHead;
            int carry = 0;
            while (p1 != null || p2 != null) {
                int x1 = (p1 != null) ? p1.val : 0;
                int x2 = (p2 != null) ? p2.val : 0;
                int sum = carry + x1 + x2;
                carry = sum / 10;
                current.next = new ListNode(sum % 10);
                current = current.next;
                if (p1 != null)
                    p1 = p1.next;
                if (p2 != null)
                    p2 = p2.next;
            }
            if (carry > 0) {
                current.next = new ListNode(carry);
            }
            return dummyHead.next;
        }
    
        public static void main(String[] args) {
            /*        int[] num1 = new int[] { 2, 4, 3 };
            int[] num2 = new int[] { 5, 6, 4 };
            
            ListNode l1 = new ListNode(0);
            ListNode node = l1;
            for (int i = 0; i < num1.length; i++) {
                node.val = num1[i];
                if (i < num1.length - 1) {
                    node.next = new ListNode(0);
                    node = node.next;
                }
            }
            System.out.println(l1);
            
            ListNode n2 = new ListNode(0);
            node = n2;
            for (int i = 0; i < num2.length; i++) {
                node.val = num2[i];
                if (i < num2.length - 1) {
                    node.next = new ListNode(0);
                    node = node.next;
                }
            }
            System.out.println(n2);*/
            
            ListNode l1 = new ListNode(2);
            ListNode node2 = new ListNode(4);
            ListNode node3 = new ListNode(3);
            l1.next = node2;
            node2.next = node3;
            System.out.println(l1);
    
            ListNode l2 = new ListNode(5);
            ListNode node5 = new ListNode(6);
            ListNode node6 = new ListNode(4);
            l2.next = node5;
            node5.next = node6;
            System.out.println(l2);
            
            ListNode res = new AddTowNumbers().addTwoNumbers(l1, l2);
            System.out.println(res);
            
        }
    
    }

    36.无重复字符的最长子串

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

    示例 1:

    输入: "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

    示例 2:

    输入: "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

    示例 3:

    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
         请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

    官方题解

    package leecode;
    
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Set;
    
    public class T03_LengthOfLongestSubstring {
    
        /**
         * 方法1:暴力法
         *//*
            public int lengthOfLongestSubstring(String s) {
            int n = s.length();
            int ans = 0;
            for (int i = 0; i < n; i++) {
                for (int j = i + 1; j < n; j++) {// s的所有子串
                    if (allUnique(s, i, j)) {
                        ans = Math.max(ans, j - i);
                    }
                }
            }
            return ans;
            }
            
            // 检查子串中是否包含相同的元素
            public boolean allUnique(String s, int start, int end) {
            Set<Character> set = new HashSet<>();
            for (int i = start; i < end; i++) {
                Character ch = s.charAt(i);
                if (set.contains(ch))
                    return false;
                set.add(ch);
            }
            return true;
            }
            */
        /**
         * 方法2
         *//*
            public int lengthOfLongestSubstring(String s) {
            int n = s.length();
            Set<Character> set = new HashSet<>();
            int ans = 0, i = 0, j = 0;
            
            while (i < n && j < n) {
                // try to extend the range [i, j]
                if (!set.contains(s.charAt(j))) {
                    set.add(s.charAt(j++));
                    ans = Math.max(ans, j - i);
                } else {
                    set.remove(s.charAt(i++));
                }
            }
            return ans;
            }*/
        /**
         * 方法3
         */
        public int lengthOfLongestSubstring(String s) {
            int n = s.length(), ans = 0, i = 0;
            HashMap<Character, Integer> map = new HashMap<>();
            for (int j = 0; j < n; j++) {
                if (map.containsKey(s.charAt(j))) {
                    i = Math.max(map.get(s.charAt(j)), i);
                }
                ans = Math.max(ans, j - i + 1);
                map.put(s.charAt(j), j + 1);
            }
            return ans;
        }
    
        public static void main(String[] args) {
            T03_LengthOfLongestSubstring s = new T03_LengthOfLongestSubstring();
            System.out.println(s.lengthOfLongestSubstring("bbbbb"));
            System.out.println(s.lengthOfLongestSubstring("abcabcbb"));
            System.out.println(s.lengthOfLongestSubstring("pwwkew"));
        }
    }

  • 相关阅读:
    [Luogu5042/UOJ #100][国家集训队互测2015]丢失的题面/ydc的题面
    [51nod1773]A国的贸易
    [GZOI2019&GXOI2019]省选GG记
    [51nod1659]数方块
    [51nod1052]最大M子段和
    [51nod1201]整数划分
    [51nod1084]矩阵取数问题 V2
    [51nod1020]逆序排列
    [BZOJ3000]Big Number
    [BZOJ1684][Usaco2005 Oct]Close Encounter
  • 原文地址:https://www.cnblogs.com/xinmomoyan/p/12234513.html
Copyright © 2011-2022 走看看