高频算法题解 java

替换空格

 public void replaceSpace(){
        String s="abc de f ";
        String t= s.replace(" ","%20");
        System.out.println(t);
    }

顺时针打印矩阵

import java.util.ArrayList;
import java.util.List;

public class SpiralMatrix {

    public List<Integer> spiralOrder(int[][] matrix) {
         List<Integer> list=new ArrayList<>();
        int row=0;int col=0;
        int rowlen=matrix.length-1;int collen=matrix[0].length-1;
        while(row<=rowlen&&col<=collen) {
            for (int j = col; j <= collen; j++) {
                list.add(matrix[row][j]);
            }
            for(int i=row+1;i<=rowlen;i++){
                list.add(matrix[i][rowlen]);
            }
            if(rowlen>row&&collen>col){
                for(int j=collen-1;j>col;j--){
                    list.add(matrix[rowlen][j]);
                }
                for(int i=rowlen;i>row;i--){
                    list.add(matrix[i][row]);
                }
            }
            row++;col++;rowlen--;collen--;
        }
        return list;
    }
}

Ip的组成有几种

import java.util.ArrayList;

public class IpAddress {

    public static void main(String[] args) {
        String s = "25525511135";
        System.out.println(restoreIpAddresses(s));
    }

    public static ArrayList<String> restoreIpAddresses(String s) {

            ArrayList<String> res = new ArrayList<String>();
            if (s.length() < 4) return res;
            for (int i = 1; i < 4 && i < s.length() - 2; i++) {
                for (int j = i + 1; j < i + 4 && j < s.length() - 1; j++) {
                    for (int k = j + 1; k < j + 4 && k < s.length(); k++) {
                        String s1 = s.substring(0, i);
                        String s2 = s.substring(i, j);
                        String s3 = s.substring(j, k);
                        String s4 = s.substring(k, s.length());
                        if (isValid(s1) && isValid(s2) && isValid(s3) && isValid(s4)) {
                            res.add(s1 + "." + s2 + "." + s3 + "." + s4);
                        }
                    }
                }
            }
            return res;
        }

    private static boolean isValid(String s) {
        if (s.length() == 0 || s.length() > 3 || (s.charAt(0) == '0' && s.length() > 1) || Integer.parseInt(s) > 255)
            return false;
        return true;

    }
}

二维字符矩阵找单词

import java.util.Scanner;

public class WordSearch {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int m=sc.nextInt();
        int n=sc.nextInt();
        char[][] board=new char[m][n];


        for (int i = 0; i < m; i++) {
                board[i] = sc.next().toCharArray();
            }
        String word = sc.next();

        boolean res=exist(board,word);
        System.out.println(res);

    }
    public static  boolean exist(char[][] board, String word) {
        int m = board.length;
        int n = board[0].length;
        boolean[][] visited = new boolean[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (dfs(board, word, 0, i, j, visited))
                    return true;
            }
        }
        return false;
    }

    public static boolean dfs(char[][] board, String word, int index, int rowindex, int colindex, boolean[][] visited) {
        if (index == word.length())
            return true;
        if (rowindex < 0 || colindex < 0 || rowindex >=board.length || colindex >= board[0].length)
            return false;
        if (visited[rowindex][colindex])
            return false;
        if (board[rowindex][colindex] != word.charAt(index))
            return false;
        visited[rowindex][colindex] = true;
        boolean res = dfs(board, word, index + 1, rowindex - 1, colindex,
                visited)
                || dfs(board, word, index + 1, rowindex + 1, colindex, visited)
                || dfs(board, word, index + 1, rowindex, colindex + 1, visited)
                || dfs(board, word, index + 1, rowindex, colindex - 1, visited);
        visited[rowindex][colindex] = false;
        return res;
    }

}


二十六进制加法


import java.util.ArrayList;
import java.util.Scanner;

public class Twentysix {
    //全局变量进位
    private static int jinWei = 0;

    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            System.out.println(hexPlus26(sc.next(), sc.next()));
        }
    }

    private static String hexPlus26(String str1, String str2) {

        ArrayList<StringBuffer> arr;

        StringBuffer sbResult = new StringBuffer();

        //将两个字符串用'a'从最高位补全,并为可能出现最长字符串最高位进一的情况,在最高位补一个a
        if (str1.length() >= str2.length()) {
            arr = completeStr(str1, str2);
        } else {
            arr = completeStr(str2, str1);
        }
        StringBuffer sb1 = arr.get(0);
        StringBuffer sb2 = arr.get(1);

        for (int i = sb1.length() - 1; i >= 0; i--) {
            int plusResult = (int) sb1.charAt(i) - 97 + (int) sb2.charAt(i) - 97 + jinWei;
            //如果发生进位,将全局变量jinWei改成1,并在下一次循环中加上,否则为0
            if (plusResult > 25) {
                sbResult.append(Character.toString((char) (plusResult - 26 + 97)));
                jinWei = 1;
            } else {
                sbResult.append((char) (plusResult + 97));
                jinWei = 0;
            }
        }
        //如果最后没发生进位,去掉之前加的a
        if (sbResult.charAt(sbResult.length() - 1) == 'a') {
            sbResult.deleteCharAt(sbResult.length() - 1);
        }
        return sbResult.reverse().toString();
    }

    private static ArrayList<StringBuffer> completeStr(String str1, String str2) {

        StringBuffer sb1 = new StringBuffer();
        StringBuffer sb2 = new StringBuffer();
        ArrayList<StringBuffer> arr = new ArrayList<StringBuffer>();

        int lengthDiff = str1.length() - str2.length();

        //为可能出现最长字符串最高位进一的情况,在最高位先补一个a(代表0)
        sb1.append("a");
        sb2.append("a");

        //将两个字符串长度用a补齐
        for (int i = 0; i < lengthDiff; i++) {
            sb2.append("a");
        }

        //将原字符串加到最后边
        sb1.append(str1);
        sb2.append(str2);

        arr.add(sb1);
        arr.add(sb2);
        return arr;
    }
}

包围的区域

输入:
4
X X X X
X O O X
X X O X
X O X X
输出:
X X X X
X X X X
X X X X
X O X X

import java.util.Scanner;
public class SurroundedRegions {

    public static void main(String[] args) {

        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();
        char[][] board=new char[n][n];
        for (int i=0;i<n;i++){
            board[i]=sc.next().toCharArray();
        }
        if (board==null||board.length==0) return;
        int row = board.length;
        int col = board[0].length;
        for(int j=0;j<col;j++){
            dfs(board,0,j);
            dfs(board,row-1,j);        //第一行和最后一行
        }
        for(int i=1;i<row-1;i++){
            dfs(board,i,0);
            dfs(board,i,col-1);       //第一列和最后一列抛去和上一个循环相交的格子
        }

        for(int i=0;i<row;i++)
            for(int j=0;j<col;j++){
                if (board[i][j]=='D') board[i][j] = 'O';
                else if (board[i][j]=='O') board[i][j] = 'X';
            }

        for(int i=0;i<row;i++){
                for(int j=0;j<col;j++){
                    System.out.print(board[i][j]);
                }
            System.out.println();
        }

    }

    public static void dfs(char[][] board, int x, int y){
        if (x<0||x>=board.length||y<0||y>=board[0].length||board[x][y]!='O') return;
        board[x][y] = 'D';
        dfs(board,x-1,y);
        dfs(board,x+1,y);
        dfs(board,x,y-1);
        dfs(board,x,y+1);
    }
}

完成数独

public class Solution {
    public void solveSudoku(char[][] board) {
        ArrayList<Integer> empty = new ArrayList<Integer>();
        for(int i=0;i<9;i++)
            for(int j=0;j<9;j++)
                if(board[i][j]=='.'){
                    empty.add(i*9+j);
                }
        int len = empty.size();
        dfs(empty,board,0,len);
    }
    
    public boolean dfs(ArrayList<Integer> empty, char[][] board, int cur, int len){
        if(cur==len) return true;
        int index = empty.get(cur);
        int row = index/9;
        int col = index%9;
        for(int v=1;v<=9;v++){
            if(isValid(v,row,col,board)){
                board[row][col] = (char)(v+'0');
                if(dfs(empty,board,cur+1,len))
                    return true;
                board[row][col] = '.';
            }
        }
        return false;
    }
    
    public boolean isValid(int v, int row, int col, char[][] board){
        for(int i=0;i<9;i++){
            if(board[row][i] - '0'==v) return false;
            if(board[i][col] - '0'==v) return false;
            int row_s = 3*(row/3) + i/3;
            int col_s = 3*(col/3) + i%3;
            if(board[row_s][col_s] - '0'==v) return false;
        }
        return true;
    }
}

N皇后问题

https://blog.csdn.net/u011095253/article/details/9158473

public class Solution {
    public ArrayList<String[]> solveNQueens(int n) {
        ArrayList<String[]> res = new ArrayList<String[]>();
        int[] loc = new int[n];
        dfs(res,loc,0,n);
        return res;
    }
    
    public void dfs(ArrayList<String[]> res, int[] loc, int cur, int n){
        if(cur==n) 
            printboard(res,loc,n);
        else{
            for(int i=0;i<n;i++){
                loc[cur] = i;
                if(isValid(loc,cur))
                    dfs(res,loc,cur+1,n);
            }
        }
    }
    
    public boolean isValid(int[] loc, int cur){
        for(int i=0;i<cur;i++){
            if(loc[i]==loc[cur]||Math.abs(loc[i]-loc[cur])==(cur-i))
                return false;
        }
        return true;
    }
    
    public void printboard(ArrayList<String[]> res, int[] loc, int n){
        String[] ans = new String[n];
        for(int i=0;i<n;i++){
            String row = new String();
            for(int j=0;j<n;j++){
                if(j==loc[i]) row += "Q";
                else row += ".";
            }
            ans[i] = row;
        }
        res.add(ans);
    }
}

验证一个字符串是否为回文

只看字母(忽略其它字符),不分大小写。如“A man, a plan, a canal: Panama”就是一个回文

class Solution {
    public boolean isPalindrome(String s) {
    
        if(s.isEmpty()) return true;
        String str = s.replaceAll("\\W", ""); // 使用正则去除非字符数字的字符
        str = str.toLowerCase();
        for(int i = 0; i < str.length(); i++) {
            if(str.charAt(i) != str.charAt(str.length() - i -1)) {
                return false;
            }
        }
        return true;
    }
}

二叉树的镜像

public boolean isSymmetric(TreeNode root) {
    if (root == null) return true;
    return isSymmetric(root.left, root.right);
}

private boolean isSymmetric(TreeNode t1, TreeNode t2) {
    if (t1 == null && t2 == null) return true;
    if (t1 == null || t2 == null) return false;
    if (t1.val != t2.val) return false;
    return isSymmetric(t1.left, t2.right) && isSymmetric(t1.right, t2.left);
}

二叉树和为某一值的路径

public void findPath(BinaryTreeNode root,int k){    
       if(root == null)    
           return;    
       Stack<Integer> stack = new Stack<Integer>();    
       findPath(root,k,stack);    
   }    
   public void findPath(BinaryTreeNode root,int k,Stack<Integer> path){    
       if(root == null)    
           return;    
       if(root.leftNode == null && root.rightNode == null){    
           if(root.value == k){    
               System.out.println("路径开始");    
               for(int i :path)    
                   System.out.print(i+",");    
               System.out.print(root.value);    
           }    
       }    
       else{    
           path.push(root.value);    
           findPath(root.leftNode,k-root.value,path);    
           findPath(root.rightNode,k-root.value,path);    
           path.pop();    
       }    
   }    

二叉树的最大深度

  public static int maxDepth(TreeNode root) {

        if(root==null){
            return 0;
        }
        if(root.left==null){
            return maxDepth(root.right)+1;
        }
        if(root.right==null){
            return maxDepth(root.left)+1;
        }
        return  max(maxDepth(root.left),maxDepth(root.right))+1;

    }

有序数组去除重复数字

package array;

public class RemoveDuplicates {
    public static void main(String[] args) throws Exception {
        int[] nums = {1,1,2,3,3,4};
        int N = new RemoveDuplicates().removeDuplicates(nums);
        for (int i = 0; i < N; i++)
            System.out.print(nums[i] + " ");

    }
        public int removeDuplicates(int[] nums) {
            if (nums.length == 1) return 1;
            int size = 1;
            for (int j = 0, i = 1; i < nums.length; i++) {
                if (nums[i] != nums[i - 1]) {
                    size++;
                    j++;
                    nums[j] = nums[i];
                }
            }
            return size;
        }

}

搜索旋转有序数组

package binarySearch;
// 时间复杂度 O(log n),空间复杂度 O(1)
public class SearchRotated { public static void main(String[] args) throws Exception {
    int[] A = {11,12,13,15,17,22,28,30,2,4,5,6,9};
    System.out.println(new SearchRotated().search(A, 17));
}

    public int search(int[] A, int target) {
        if(A==null || A.length==0)
            return -1;
        int l = 0;
        int r = A.length-1;
        while(l<=r)
        {
            int m = (l+r)/2;
            if(target == A[m])
                return m;
            if(A[m]<A[r])
            {
                if(target>A[m] && target<=A[r])
                    l = m+1;
                else
                    r = m-1;
            }
            else
            {
                if(target>=A[l] && target<A[m])
                    r = m-1;
                else
                    l = m+1;
            }
        }
        return (A[l] == target) ? l : -1;
    }

}

分点心

给孩子们分饼干,每个人的需求量不同。现给定两个数组,第一个数组为每个孩子的需求量(可理解为质量),第二个数组为每个饼干的size(可理解为质量)。求能满足孩子个数的最大值

import java.util.Arrays;

public class AssignCookies {
    public static int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int gIndex = 0, sIndex = 0;
        while (gIndex < g.length && sIndex < s.length) {
            if (g[gIndex] <= s[sIndex])
                gIndex++;
            sIndex++;
        }
        return gIndex;
    }

    public static void main(String[] args) {
        int[] g={2,3};
        int[] s={1,2,3};
        System.out.println(findContentChildren(g,s));
    }
}

删除多少字符使得两字符串相等

Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in each step you can delete one character in either string.

Input: "sea", "eat"
Output: 2
Explanation: You need one step to make "sea" to "ea" and another step to make "eat" to "ea".

Note:
The length of given words won't exceed 500.
Characters in given words can only be lower-case letters.

思路:两字符串总长-2倍最长公共字串LCS 即为删除的最小步数

import org.junit.Test;

public class DeleteOperationForTwoStrings {
    public int minDistance(String word1, String word2) {
        int m = word1.length(), n = word2.length();
        int[][] dp = new int[m + 1][n + 1];
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                dp[i][j] = word1.charAt(i - 1) == word2.charAt(j - 1) ?
                        dp[i - 1][j - 1] + 1 : Math.max(dp[i][j - 1], dp[i - 1][j]);
            }
        }
        return m + n - 2 * dp[m][n];
    }

    @Test
    public void test(){
        String w1="eat";
        String w2="sea";
        System.out.println(minDistance(w1,w2));
    }
}

最长公共子序列

public static int lcs(String str1,String str2){
        int len1 = str1.length();
        int len2 = str2.length();
        int c[][] = new int[len1+1][len2+1];
        for (int i = 1; i <= len1; i++) {
            for( int j = 1; j <= len2; j++) {
                if (str1.charAt(i-1) == str2.charAt(j-1)) {
                    c[i][j] = c[i-1][j-1] + 1;
         
                } else {
                    c[i][j] = max(c[i-1][j],c[i][j-1]);
                }
            }
        }
        return c[len1][len2];

    }

合并有序链表

public class CombinTwoList {
 public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1==null)return l2;
        if(l2==null)return l1;
        if(l1.val<l2.val){
            l1.next=mergeTwoLists(l1.next,l2);
            return l1;
        }else{
            l2.next=mergeTwoLists(l1,l2.next);
            return l2;
        }
    }
}

斐波那切数列

public class Fibo {
    public static void main(String[] args) {
        int n=11;
        System.out.println(fibo(n));
    }

    static long fibo(Integer integer){
        long fiboone=1;
        long fibotwo=1;
        if(integer==1) return 1;
        if(integer==2) return 1;
        long fiboN=1;
        for(int i=3;i<=integer;i++){
            fiboN=fiboone+fibotwo;
            fiboone=fibotwo;
            fibotwo=fiboN;
        }
        return fiboN;
    }
}

二维数组中的查找

public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix==null||matrix.length==0||matrix[0].length==0)
            return false;
        int row=0;
        int col=matrix[0].length-1;
        while(row<matrix.length&&col>=0){
            if(target==matrix[row][col])
                return true;
            else if(target>matrix[row][col])
                row++;
            else
                col--;
        }
        return false;
    }
}

出现次数超过一半的数

import java.util.Scanner;

/**
 * 输出出现次数超过一半的数,如果没有就输出0
 */
public class HalfNum {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
        }

        int count = 1;
        int num = -1;
        for (int i = 0; i < n; i++) {
            if (num != nums[i]) {
                count--;
                if (count == 0) {
                    num = nums[i];
                    count = 1;
                }
            } else {
                count++;
            }
        }
        if(count>1)
            System.out.println(num);
        else
            System.out.println(0);
    }
}

是否是子树

import org.junit.Test;

public class IsSubtree {

    @Test
    public boolean isSubtree(TreeNode s,TreeNode t){
        if(s==null) return false;
        return isSubtreeWithRoot(s,t)||isSubtree(s.left,t)||isSubtree(s.right,t);

    }

    public boolean  isSubtreeWithRoot(TreeNode s, TreeNode t){
        if(t==null&&s==null) return true;
        if(t==null||s==null) return false;
        if(t.val!=s.val) return false;
        return isSubtreeWithRoot(s.left,s.left)&&isSubtreeWithRoot(s.right,t.right);
    }
}

删除多少字符,留下来的是最长的回文串

import java.util.Scanner;

/**
 * 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。
 * 如何删除才能使得回文串最长呢?
 * 
 * 思路:翻转该串后与原串比较,求最长公共子序列,返回len-dp[len][len]
 */
public class MakeLongestPalindrome {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while (sc.hasNextLine()) {
            String s1 = sc.nextLine();
            String s2 = new StringBuilder(s1).reverse().toString();
            int len = s1.length();
            int[][] dp = new int[len + 1][len + 1];
            for (int i = 1; i <= len; i++) {
                for (int j = 1; j <= len; j++) {
                    if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
                        dp[i][j] = dp[i - 1][j - 1] + 1;
                    } else {
                        dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                    }
                }
            }
            System.out.println(len - dp[len][len]);
        }
    }
}

能容纳的最大水量

import org.junit.Test;

/**
 * leetcode11.Container With Most Water
 * Input: [1,3,2] 最短板容纳水量
 Output: 2
 */
public class MaxArea {
    public int maxArea(int[] height) {
        int i=0;
        int j=height.length-1;
        int water=0;
        while(i<j){
            water=Math.max(water,(j-i)*Math.min(height[j],height[i]));
            if(height[i]<height[j])
                i++;
            else
                j--;
        }
        return water;
    }

    @Test
    public void test(){
        int[] height={1,8,6,2,5,4,8,3,7};
        System.out.println(maxArea(height));
    }
}

子数组最大乘积

**
 * 子数组的最大乘积
 */
public class MaxProductSubString {
    public static void main(String[] args) {
        int[] nums={6,2,-3,5};
        int min=nums[0];
        int max=nums[0];
        int ans=nums[0];
        for(int i=1;i<nums.length;i++){
            int a=min*nums[i];
            int b=max*nums[i];
            max=Math.max(Math.max(a,b),nums[i]);
            min=Math.min(Math.min(a,b),nums[i]);
            ans=Math.max(ans,max);
        }
        System.out.println(ans);

    }
}

纸币的组合数有多少种(美团2017)

import java.util.Scanner;

/**
 * 给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,
 * 编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。
 */

public class Meituan20172 {

    public static void main(String[] args) {
        int[] coins={1,5,10,20,50,100};
        Scanner sc=new Scanner(System.in);
        Integer n=sc.nextInt();
        if(n<=0) System.out.println(0);
        long[] dp=new long[n+1];
        dp[0]=1;
        for(int c:coins){
            for(int i=c;i<=n;i++){
                dp[i]=dp[i]+dp[i-c];
            }
        }
        System.out.println(dp[n]);
    }
}

柱状图矩形的最大面积(美团2017)

import java.util.Scanner;

/**
 * 给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的
 * 宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。
 * 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。
 */
public class Meituan20173 {

    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] nums=new int[n];
        for(int i=0;i<n;i++){
            nums[i]=sc.nextInt();
        }

        int max = 0;
        int len = nums.length;
        for(int i=0; i<len; i++){
            int minH = nums[i];
            for(int j=i; j<len; j++){
                minH = Math.min(minH, nums[j]);
                max = Math.max(max, (j-i+1)*minH);
            }
        }
        System.out.println(max);
    }
}

最长公共子串

import java.util.Scanner;

/**
 * 给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。
 */

public class Meituan20174 {
    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        String  s1=sc.nextLine();
        String s2=sc.nextLine();

        int l1=s1.length();
        int l2=s2.length();
        int[][] dp=new int[l1+1][l2+1];
        int res=0;
        for(int i=1;i<=l1;i++){
            for(int j=1;j<=l2;j++){
                if(s1.charAt(i-1)==s2.charAt(j-1)){
                    dp[i][j]=dp[i-1][j-1]+1;
                    res=Math.max(res,dp[i][j]);
                }
                else{
                    dp[i][j]=0;
                }
            }
        }
        System.out.println(res);
    }
}

二进制数中1的个数

public class NumbesOf1 {
    public static void main(String[] args) {
        int a=12;
        int count=0;
        while(a!=0){
            a=a&(a-1);
            count++;
        }
        System.out.println(count);
    }
}

字符串的全排列

输入为数字数组,输出为二维列表

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class Solution {

    // 最终返回的结果集
    List<List<Integer>> res = new ArrayList<List<Integer>>();

    @Test
    public void permute() {
        int[] nums={1,2,3};
        int len = nums.length;


        // 采用前后元素交换的办法,dfs解题
        exchange(nums, 0, len);
        System.out.println(res);
    }

    public void exchange(int[] nums, int i, int len) {
        // 将当前数组加到结果集中
        if(i==len-1) {
            List<Integer> list = new ArrayList<>();
            for (int j=0; j<len; j++){
                list.add(nums[j]);
            }
            res.add(list);
            return ;
        }
        // 将当前位置的数跟后面的数交换,并搜索解
        for (int j=i; j<len; j++) {
            swap(nums, i, j);
            exchange(nums, i+1, len);
            swap(nums, i, j);
        }
    }

    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

输入为字符串,输出为console每行输出

/**
  * 参数array:给定字符串的字符数组
     * 参数start:开始遍历字符与其后面各个字符将要进行交换的位置
     * 参数end:字符串数组的最后一位
     * 函数功能:输出字符串数字的各个字符全排列
     *
     */
public class PermutationAll {//方法1:递归实现

    public static void main(String[] args){
        String s = "abcd";
        char[] array = s.toCharArray();
        recursion(array,0,array.length-1);
    }

    public static void recursion(char[] array,int start,int end){
        if(end <= 1)
            return;
        if(start == end){
            for(int i = 0;i < array.length;i++)
                System.out.print(array[i]);
            System.out.println();
        }
        else{
            for(int i = start;i <= end;i++){
                swap(array,i,start);
                recursion(array,start+1,end);
                swap(array,i,start);
            }
        }
    }
    //交换数组m位置和n位置上的值
    public static void swap(char[] array,int m,int n){
        char temp = array[m];
        array[m] = array[n];
        array[n] = temp;
    }
}

有重复数字的全排列

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Solution {

    List<List<Integer>> res = new ArrayList<List<Integer>>();

    public List<List<Integer>> permuteUnique(int[] nums) {
        int len = nums.length;
        if(len==0||nums==null)  return res;

        boolean[] used = new boolean[len];
        List<Integer> list = new ArrayList<Integer>();

        Arrays.sort(nums);
        dfs(nums, used, list, len);
        return res;
    }

    public void dfs(int[] nums, boolean[] used, List<Integer> list, int len) {
        if(list.size()==len) {
            res.add(new ArrayList<Integer>(list));
            return ;
        }
        for (int i=0; i<len; i++) {
            // 当前位置的数已经在List中了
            if(used[i]) continue;
            // 当前元素与其前一个元素值相同 且 前元素未被加到list中,跳过该元素
            if(i>0 && nums[i]==nums[i-1] && !used[i-1])   continue;
            // 深度优先搜索遍历
            used[i]=true;
            list.add(nums[i]);
            dfs(nums, used, list, len);
            list.remove(list.size()-1);
            used[i]=false;
        }
    }
}

Z字型打印二叉树

import org.junit.Test;


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Stack;

/**
 * Z字型打印二叉树
 */
public class PrintBintreeByZ {

    @Test
    public void print(TreeNode root) {
        
        List<List> listall = new ArrayList<>();
        Stack<TreeNode> nowStack = new Stack<>();
        nowStack.push(root);
        boolean flag=false;
        while (!nowStack.isEmpty()) {
            flag=!flag;
            Stack<TreeNode> nextStack = new Stack<>();
            List<Integer> listone = new ArrayList<>();
            for(TreeNode node:nowStack) {
                listone.add(node.val);
                if (node.right != null)
                    nextStack.add(node.right);
                if (node.left != null)
                    nextStack.add(node.left);
            }
            nowStack = nextStack;
            if(flag)
                Collections.reverse(listone);
            listall.add(listone);
        }
        System.out.println(listall);
    }
}

从尾到头打印链表


import java.util.Stack;

public class PrintListFromTail {
    public static void main(String[] args) {
        ListNode listNode=null;
        Stack<Integer> sk=new Stack<>();
        while(listNode!=null){
            sk.push(listNode.val);
        }
        while(!sk.isEmpty()){
            System.out.println(sk.pop()+" ");
        }
    }
}

翻转链表

import org.junit.Test;


public class ReverseList {
    @Test
    public ListNode reverseList(ListNode head){
        if(head==null) return  null;
        ListNode pre=null;
        ListNode cur=null;
        while(head.next!=null){
            pre=head.next;
            head.next=cur;
            cur=head;
            head=pre;
        }
        return head;
    }
}

单例模式

/**
 *静态内部类实现单例
 */

public class Singleton {

    private Singleton() {
    }

    private static class SingletonHolder{
        public static final Singleton instance=new Singleton();
    }

    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }

}

链表倒数第K个数

import org.junit.Test;

public class TheKthNodeFromTail {
    @Test
    public ListNode main(ListNode head,int k) {
        ListNode listNode=head;
        if(listNode==null||k<=0)
           return  null;
        ListNode nodeA=head;
        for(int i=1;i<k;i++) {
            if (listNode != null) {
                listNode=listNode.next;
            }
            else{
                return null;
            }
        }
        while(listNode.next!=null){
            listNode=listNode.next;
            nodeA=nodeA.next;
        }
        return nodeA;
    }

}

收集雨水

import org.junit.Test;

/**
 * leetcode42.
 * Given n non-negative integers representing an elevation map where the
 * width of each bar is 1, compute how much water it is able to trap
 * after raining.
 */
public class TrappingRainWater {
        public int trap(int[] height) {
            int l = 0, r = height.length - 1, level = 0, res = 0;
            while (l < r) {
                int lower = height[(height[l] < height[r]) ? l++ : r--];
                level = Math.max(level, lower);
                res += level - lower;
            }
            return res;
        }


    @Test
    public void test(){
        int[] height={0,1,0,2,1,0,1,3,2,1,2,1};
        System.out.println(trap(height));
    }
}

两个栈实现队列

import java.util.Stack;

public class TwoStackQueue {
    Stack<Integer> skpush=new Stack<>();
    Stack<Integer> skpop=new Stack<>();

    public  void push(Integer integer){
        skpush.push(integer);
    }

    public int pop(){
        while(!skpush.isEmpty()){
            skpop.push(skpush.pop());
        }
        return skpop.pop();
    }
}

字符串能否由字符串数组中的小字符串拼接

import java.util.ArrayList;
import java.util.List;

public class WordBreak {
    public static void main(String[] args) {
        String s="leetcode";
        List<String> wordDict=new ArrayList<>();
        wordDict.add("leet");
        wordDict.add("code");

        int len=s.length();
        boolean[] dp=new boolean[len+1];
        dp[0]=true;
        for(int i=1;i<=len;i++){
            for(int j=0;j<i;j++){
                String tmp=s.substring(j,i);
                if(dp[j] && wordDict.contains(tmp)){
                    dp[i]=true;
                    break;
                }
            }
        }
        System.out.println(dp[len]);

    }
}

01背包

public int knapsack(int cap, int N, int[] weights, int[] val) {
    int[] dp = new int[cap+ 1];
    for (int i = 1; i <= N; i++) {
        int w = weights[i - 1], v = val[i - 1];
        for (int j = cap; j >= 1; j--) {
            if (j >= w) {
                dp[j] = Math.max(dp[j], dp[j - w] + v);
            }
        }
    }
    return dp[cap];
}

最长的回文子串

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Input: "cbbd"
Output: "bb"

class Solution {
    private static int low;
    private static int maxLen;
    public String longestPalindrome(String s) {
        int len=s.length();
        if(len<2){
            return s;
        }
        for(int i=0;i<len;i++){
            extend(s,i,i);
            extend(s,i,i+1);
        }
        return s.substring(low, low+maxLen);
    }
    private static void extend(String s, int j, int k) {
        while(j>=0&&k<s.length()&&s.charAt(j)==s.charAt(k)){
            j--;
            k++;
        }
        if(maxLen<k-j-1){
            low=j+1;
            maxLen=k-j-1;
        }

    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容

  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 1,762评论 0 2
  • 前言 2. 实现 Singleton 3. 数组中重复的数字 4. 二维数组中的查找 5. 替换空格 6. 从尾到...
    Observer_____阅读 2,929评论 0 1
  • 2017-9-8 姓名:李义 公司:慈溪创鑫车辆零部件有限公司 组别:259期利他二组 【知~学习】 背诵 六项精...
    六度轮回阅读 86评论 0 0
  • 这便是春,淅沥的雨,笔触生涩,却在这润雨声中化开了。 已经许久,内心仍渴望拥有一角桑榆之地,可以聆听偶尔落下的雨。...
    卖萌的柠檬阅读 510评论 1 4
  • 第一次接触这篇文章吧,像读个短片小说,侦探类型的。内容很紧凑,悬疑点埋伏的很多,讲述了时下最流行的朝阳群众西城大妈...
    牵累阅读 184评论 0 0