面试常见算法

常见算法

常见问题

1.牛客力扣上默认的方法名字改了后可能会报错

2.String和Char相互转换
s.toCharArray();
String.valueOf©;//string转换成char
String转换成int
Integer.parseInt();

3.通过HashSet踢除重复元素

public static List removeDuplicate(List list) {   
    HashSet h = new HashSet(list);   
    list.clear();   
    list.addAll(h);   
    return list;   
}  

4.String转换为StringBuffer,StringBuffer能直接用reverse倒置数组,判断是否回文数组

1.字符串数组排序(冒泡)

package input_output;
import java.util.Scanner;
//冒泡字符串数组排序
public class stringsort {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String arr = sc.nextLine();
        char[] arr1 = arr.toCharArray();
        for (int i = 0; i < arr1.length - 1; i++) {     //记得<length-1
            for (int j = i + 1; j < arr1.length; j++) {   //这里小于length
                if (arr1[i] > arr1[j]) {
                    char temp = arr1[i];
                    arr1[i] = arr1[j];
                    arr1[j] = temp;
                }
            }
        }
        for (int t = 0; t < arr1.length; t++) {
            System.out.print(arr1[t] + " ");
        }
    }
}

2.筛选n以内的素数

筛选法求解过程为:将2~n之间的正整数放在数组内存储,
将数组中2之后的所有能被2整除的数清0,
再将3之后的所有能被3整除的数清0 ,以此类推,直到n为止。
数组中不为0 的数即为素数
输入描述:多组输入,每行输入一个正整数(不大于100)。
输出描述:针对每行输入的整数n,输出两行,第一行,输出n之内(包括n)的素数,用空格分隔,
第二行,输出数组中2之后被清0的个数。每行输出后换行。
输入:20
输出:2 3 5 7 11 13 17 19
11

public class shaixuan {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] a = new int[105];
        int n = 0;
        while (sc.hasNext()) {
            n = sc.nextInt();
            for (int i = 2; i <= n; i++) {
                a[i] = i;
            }
            for (int j = 3; j <= n; j++) {
                for (int k = j; k <= n; k++) {
                    if (a[k] % (j-1) == 0) {
                        a[k] = 0;
                    }
                }
            }
            int count = 0;
            for (int i = 2; i <= n; i++) {
                if (a[i] != 0) {
                    System.out.print(a[i] + " ");
                } else count++;
            }
            System.out.print("\n"+count);}}}

3.判断n是否素数

package input_output;
import java.util.Scanner;
public class sushu {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int j = sc.nextInt();
        int k;
        for (k = 2; k < j; k++) {
            if (j % k == 0) {
                break;
            }
        }
        if (k == j) {
            System.out.println(j + "是素数");
        } else
            System.out.println(j + "不是素数");
    }
}
//法二:将循环范围定在2到指定数的二分之一(原理:任何一个数的最大因数都小于等于它的二分之一,所以只要从2查找到x/2,如果都没有被整除就是素数,因为到这里已经查找到他的最大因数了。例如24的最大因数为12,100的最大因数为50.)
    public static void isPrime2(int x){
        boolean flag;
        int i=0;
        int j=0;
        flag=true;
        for(j=2;j<=x/2;j++){
            if(x%j==0){
                flag=false;
                break;
            }
        }
        if(j>x/2){
            System.out.println("是素数");
        }else{
            System.out.println("不是素数");
        }
    }
    public static void main(String[] args) {
        isPrime2(17);
    }

4.字符串转换为char数组

package com.journaldev.util;
 
import java.util.Arrays;
 
public class StringToCharArray {
	public static void main(String[] args) {
		String str = "journaldev.com";
		char[] charArr = str.toCharArray();
		// print the char[] elements
		System.out.println("String converted to char array: " 
							+ Arrays.toString(charArr));
	}
}

5.两个数组相似度

题目描述 :给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。

输入描述:
第一行包含两个整数m和n,表示图像的行数和列数,用单个空格隔开。
1≤m≤100, 1≤n≤100。之后m行,每行n个整数0或1,表示第一幅黑白图像上各像素点的颜色,相邻两个数用单个空格隔开。
之后m行,每行n个整数0或1,表示第二幅黑白图像上各像素点的颜色,相邻两个数用单个空格隔开。

输出描述:一个实数,表示相似度(以百分比的形式给出),精确到小数点后两位。

输入:3 3
1 0 1
0 0 1
1 1 0
1 1 0
0 0 1
0 0 1
输出:44.44

import java.util.Scanner;
public class xiangsidu {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        int[][] m1 = new int[m][n];
        int[][] n1 = new int[m][n];
        double count = 0;  //必须是double类型,要不默认整型后面没办法弄
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                m1[i][j] = sc.nextInt();   //有些不用管输入一行空格分开
                
            }  }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                n1[i][j] = sc.nextInt();
            }  }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (m1[i][j] == n1[i][j]) {
                    count++;
                }   }}
        double k = count / (m * n) * 100;
        System.out.println(String.format("%.2f", k));  //小数点后两位  String.format
    }
}

6.字符数组内是否有某一字符串

题目描述:有个软件系统登录的用户名和密码为(用户名:admin,密码:admin),用户输入用户名和密码,判断是否登录成功。
输入描述:多组测试数据,每行有两个用空格分开的字符串,第一个为用户名,第二个为密码。
输出描述:链接:针对每组输入测试数据,输出为一行,一个字符串(“Login Success!”或“Login Fail!”)。
输入:admin admin
输出:Login Success!

import java.util.Scanner;
public class login {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] login = sc.nextLine().split(" ");
        String a = "admin";
        String b = "admin";
        if (login[0].equals(a) && login[1].equals(b)) {   //包含某一字符串是cotain
            System.out.println("Login Success!");
        } else System.out.println("Login Fail!");
    }
}

7.字符串排序

输入描述:多个测试用例,每个测试用例一行。
每行通过,隔开,有n个字符,n<100
输出描述:对于每组用例输出一行排序后的字符串,用’,'隔开,无结尾空格
输入:a,c,bb
f,dddd
nowcoder
输出:a,bb,c
dddd,f
nowcoder

public class char_3 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while (sc.hasNextLine()){
            String[] string=sc.nextLine().split(",");
            Arrays.sort(string);
            System.out.println(String.join(",",string));
        }
    }
}

8.字符串排序

输入描述:输入有两行,第一行n
第二行是n个字符串,字符串之间用空格隔开
输出描述:输出一行排序后的字符串,空格隔开,无结尾空格
输入:5
c d a bb e
输出:a bb c d e

public class char_input {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String n=sc.nextLine();
        while (sc.hasNextLine()) {
        
            String[] array = sc.nextLine().split(" ");
            Arrays.sort(array);
            System.out.println(String.join(" ",array));
        }
    }
}

9.每行数组求和

输入描述:
输入数据有多组, 每行表示一组输入数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。
输出描述:
每组数据输出求和的结果
输入:4 1 2 3 4
5 1 2 3 4 5
输出:10
15

public class duohang {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while (sc.hasNext()) {
            int a= sc.nextInt();
            int sum=0;
            for (int i=0;i<a;i++){
                    sum+= sc.nextInt();
                }
                System.out.println(sum);
            }
        }
    }

10.每行数组求和

输入描述:输入数据有多组, 每行表示一组输入数据。
每行不定有n个整数,空格隔开。(1 <= n <= 100)。
输出描述:每组数据输出求和的结果
输入:1 2 3
4 5
0 0 0 0 0
输出:6
9
0

public class duozu {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String[] array = sc.nextLine().split(" ");
            int sum = 0;

            for (int i = 0; i < array.length; i++) {
                sum += Integer.parseInt(array[i]);
            }
            System.out.println(sum);
        }
        }
        }

11.每行数组求和

public class lianghang {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (sc.hasNext()) {
            int a = sc.nextInt();
            for (int i = 0; i < a; a++) {
                int sum = 0;
                for (int j = sc.nextInt(); j > 0; j--) {
                    int b = sc.nextInt();
                    sum = sum + b;   }
                System.out.println(sum);
            }
            }}}

12.每行数组求和

输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
接下来t行, 每行一组数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。
每组数据输出求和的结果
输入: 2
4 1 2 3 4
5 1 2 3 4 5
输出: 10
15

public class lianghang {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int a = sc.nextInt();
            for (int i = 0; i < a; a++) {
                int sum = 0;
                for (int j = sc.nextInt(); j > 0; j--) {
                    int b = sc.nextInt();
                    sum = sum + b;
                }
                System.out.println(sum);
            }
        }
    }
}

13.判断一个字符串中出现次数最多的字符并统计其出现的次数(面试题)

法一:放在hashmap中,对字符串进行循环,如果hashmap中包含的话,给value+1,将value赋值给max,输出重复次数,找到对应字符。

在这里插入代码片package input_output;

import java.util.HashMap;
import java.util.Scanner;

public class repeata {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        char[] str1 = str.toCharArray();
        HashMap<Character, Integer> map = new HashMap();
        int count = 1;
        int max = 0;
        String repeat = "";
        for (int i = 0; i < str1.length; i++) {
            if (!map.containsKey(str1[i])) {
                map.put(str1[i], count);
            } else {
                map.put(str1[i], ++count);
            }
            if (map.get(str1[i]) > max) {
                max = map.get(str1[i]);
                repeat = String.valueOf(str1[i]);
            }
        }
        System.out.println(repeat + " " + max);
    }
}
//hashmap  添加元素(map.put())  访问元素(map.get(key))  删除元素(map.remove())   计算map的大小(map.size())   for (Object key : map.keySet()) 遍历key-value合集   for(Object value: map.values())  遍历value合集

//

法二:利用两个ArrayList,ArrayList 是一个数组队列,提供了相关的添加(array.add())、删除(array.remove())、修改(array.set(,))、遍历(for循环)、访问(array.get()).

import java.util.ArrayList;
import java.util.Scanner;
public class repeata {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int j = 0;
         char[] str1 = str.toCharArray();
        ArrayList<Character> list1 = new ArrayList<>();
        ArrayList<Integer> list2 = new ArrayList<>();
        int count = 0;
        int max = 0;
        String a = null;
        for (int i = 0; i < str1.length; i++) {
            if (!list1.contains(str1[i])) {
                list1.add(str1[i]);
                list2.add(1);
            } else {
                list2.set(list1.indexOf(str1[i]), list2.get(list1.indexOf(str1[i])) + 1);   //Arraylist修改元素
            }
        }
        for (int i = 0; i < list2.size(); i++) {
            if (list2.get(i) > max) {
                max = list2.get(i);
                a = String.valueOf(list1.get(i));
                //  或者直接赋值给j
                j = i;
            }
        }
        System.out.println(a + " " + max);
        System.out.println(list1.get(j) + " " + max);
    }
}

14.一个数组中只有一个数字是重复的,找出重复的数字

题目描述:数字1-1000放在一个长度为1001的int 类型的数组中,其中只有一个数字是重复的,求这个重复数字是哪个?(要求所有元素最多只能取一次)

调用put方法时,如果已经存在一个相同的key, 则返回的是前一个key对应的value,同时该key的新value覆盖旧value;
如果是新的一个key,则返回的是null;

import java.util.ArrayList;
public class getrepeat {

    public static void main(String[] args) {
    	int a[] = {1, 2, 3, 4, 5, 1};
        System.out.println(getrepeat(a));
    }
    public static int getrepeat(int e[]) {
        Integer key = 0;
        int i = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        for (key = 0; i < e.length; i++) {
            key = map.put(e[i], e[i]);
            if (key != null)
                break;
        }
        return key;
    }
    }

2.一个字符串中只有一个字符是重复的,找出重复的字符,用hashmap

import java.util.ArrayList;
public class getrepeat {
    public static void main(String[] args) {
        String a = "abcskidhtuvekf";
        char[] str = a.toCharArray();
        getrepeat(str);
    }

    public static void getrepeat(char[] str) {
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < str.length; i++) {
            if (!list.contains(str[i])) {
                list.add(str[i]);
            } else {
                System.out.println(str[i]);
                break;
            }
        }
    }
}


15.查找字符串中重复的子串,并输出重复的次数

对一个字符串,从第一个字符开始,检查前两个字符组成的字符串,是否被它后面的子串包含。如果没有包含,则从第二个字符开始同样的方法检查;如果包含则统计包含数量。

import java.util.HashMap;
public class RepeatString 
{
public static void main(String[] args)
{
	String str="abcdefghcdefaecdehkcdefdedehkcfa";
	HashMap<string,integer=""> map=new HashMap<>();
	
	for(int i=0;i<str.length()-3;i++)//处理的字符串向后移动
	{
		int k=i;
		String str1=str.substring(i,i+2);
		String str2=str.substring(i+2);		
		while(str2.contains(str1))//后面的字串包含前面的
		{
			int cnt=1;
			String strtemp=str2;
			while(strtemp.contains(str1))
			{
				cnt++;

		strtemp=strtemp.substring(strtemp.indexOf(str1)+str1.length());
				//被查找的字符串更新
			}
			if(!map.containsKey(str1))
			      map.put(str1,cnt);//放入HashMap
		
			str1=str.substring(i,++k+2);//”可能的重复串“扩展
			str2=str.substring(k+2);			
		}
	}
	int j=0;//以下程序为了格式化输出
	for(Object key:map.keySet())
	{	
	  j++;
      System.out.print(key+":"+map.get(key)+"\t");
	  if(j%5==0)
	  System.out.println();		
	}
}
}

16.查找一个数组中只出现了奇数次的那个数(其他数都出现了偶数次)[两个奇数次

]
异或运算。00=0 | 01=1 | 01=1 | 11=0 只有两个真值不同才是1

数字转换为二进制不断异或。两个相同的数异或等于0,所以只要偶数个相同的数异或肯定为0,奇数个数异或最后剩下一个数就是它本身

异或中运算和异或顺序无关,所以不用在乎数组中数字的顺序

package input_output;
import java.util.Scanner;
public class yihuo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] array = sc.nextLine().split(" ");
        int[] arr = new int[array.length];
        int ero = 0;
        for (int i = 0; i < array.length; i++) {
            arr[i] = Integer.parseInt(array[i]);
        }
        for (int j = 0; j < arr.length; j++) {
            ero ^= arr[j];
        }
        System.out.println(ero);
    }
}

有两种数出现了奇数次,其他所有数出现了偶数次。怎么样找到这两种数。

获取全部异或结果。然后获取到二进制中最右边的那一个1。用这个1来区别a和b。得到a或者b以后,a^ (a^b)=b。可以得出另外一个数。

 public static void findNum2(int[] arr){
        int tem = 0;
        for (int i:arr){
            tem ^= i;
        }//tem 必然为 a^b。因为不是0。所以肯定二进制中肯定有一位1
        int rightOne = tem & (~tem +1);//获取二进制中最右边的那一位1
        int onlyOne = 0;
        for (int j:arr){
            if ((j&rightOne)==0){
            //找出其中一个a^b。a或者b。就是用最右边它俩不同的1来区分的。
                onlyOne ^= j;
            }
        }
        System.out.println(onlyOne + " " + (onlyOne^tem) );
    }

17.题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。

例如,输入”They are students.”和”aeiou”,则删除之后的字符串变成”Thy r stdnts.

思路:首先要将第一个字符串中的每个字符截取出来,截取成单个字符,然后用contains方法进去比较,如果第二个字符串中包含有第一个字符串中的字符,就舍弃掉,如果不包含则保留使用StringBuffer的append方法进行拼接;实现如下 :

StringBuffer:追加字符串: a.append(String str) 替换字符: a.setCharAt(int index, char ch)
反转字符串: a.reverse(); 删除字符串: 指定位置的字符 a.deleteCharAt(int index) 移除序列中子字符串的字符 a.delete(int start,int end);

法一:

package input_output;
import java.util.Scanner;

public class delete3 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String str1=sc.nextLine();
        String str2=sc.nextLine();
        StringBuffer s=new StringBuffer();
        String[] a=str1.split("");
        for (int i=0;i<a.length;i++){
            if (!str2.contains(a[i])){
                s.append(a[i]);
            }
        }
        System.out.println(s);
    }
}

法二:用一个ArrayList存放删除后的字符,要注意的是String.Contains()括号里需要的是CharSequence,直接String.Contains(a.charAt(i))返回值是char ,所以需要用String.valueOf(由基本数据型态转换成String)转换一下

public class delete1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.nextLine();
        String str2 = sc.nextLine();
        ArrayList s = deletePattern(str1, str2);
        for (int i = 0; i < s.size(); i++) {
            System.out.print(s.get(i));
        }
    }
    public static ArrayList<Character> deletePattern(String a, String b) {
        ArrayList<Character> s = new ArrayList<>();
        for (int i = 0; i < a.length(); i++) {
            if (!b.contains(String.valueOf(a.charAt(i)))){
                //Required type:CharSequence
                //Provided:char   不转成String会没办法用contain
                s.add(a.charAt(i));
            }
        }
        return s;
    }
}

法三:将第一个字符串转换为String类型字符串,每一个字符占位一个单位,而非直接转换为char类型
b.contains()里面就可以直接输入String字符串a[i]

package input_output;
import java.util.ArrayList;
import java.util.Scanner;

public class delete {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.nextLine();
        String str2 = sc.nextLine();
        ArrayList s = deletePattern(str1, str2);
        for (int i = 0; i < s.size(); i++) {
            System.out.print(s.get(i));
        }
    }
    public static ArrayList<String> deletePattern(String a, String b) {
        ArrayList<String> s = new ArrayList<>();
        String[] arr=a.split("");
        for (int i = 0; i < a.length(); i++) {
            if (!b.contains(arr[i])) {
               s.add(arr[i]);
            }
        }
        return s;
    }
}

18.题目:不含有重复字符的 最长子串 的长度

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是"wke",所以其长度为 3

public class buchongfu {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        System.out.println(lengthOfLongestSubstring(s));
    }
/*法二:优化滑动窗口
    public static int length(String s) {
        int[] last = new int[128];
        for (int i = 0; i < 128; i++) {
            last[i] = -1;
        }
        int n = s.length();
        int res = 0;
        int start = 0;
        for (int i = 0; i < n; i++) {
            int index = s.charAt(i);
            start = Math.max(start, last[index] + 1);
            res = Math.max(res, i - start + 1);
            last[index] = i;
        }
        return res;
    }
    */
    public static int lengthOfLongestSubstring(String s) {
        int max = 0;
        char t = ' ';
        Map<Character, Integer> map = new HashMap<>();
        for (int start = 0, end = 0; end < s.length(); end++) {
            if (map.containsKey(s.charAt(end))) {
                Integer value = map.get(s.charAt(end));
                if (value >= start) start = value + 1; //上一个重复元素需要在窗口内
            }
            map.put(s.charAt(end), end);//map的key一样,不新添加
            int windowLength = end - start + 1;
            if (max < windowLength) {
                max = Math.max(max, windowLength);
            }
        }
        return max;
    }
}

19.题目:两数之和a+b=sum(一串数组中找出a+b)

给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

package input_output;
import java.util.HashMap;
import java.util.Scanner;
public class laingshuzhihe {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] a = sc.nextLine().split(",");
        int[] b = new int[a.length];
        int target = sc.nextInt();
        for (int i = 0; i < a.length; i++) {
            b[i] = Integer.parseInt(a[i]);
        }
        int[] c = sum(b, target);
        for (int i = 0; i < c.length; i++) {
            System.out.println(c[i]);
        }
    }
    /*输出数组最后一个不带逗号[2,3,4,5]而非[2,3,4,5,]
     if (i=c.length-1){
                System.out.println(c[i]);
            }else System.out.println(c[i]+",");
     */
    public static int[] towsum(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};
                }
            }
        }
        return new int[0];
    }
//法二:hashmap,时空复杂度都是on
    public static int[] sum(int[] nums, int target) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(target - nums[i])) {
                return new int[]{map.get(target - nums[i]), i};
            }
            map.put(nums[i], i);
        }
        return new int[0];
    }
}

20.题目:卖股票的最佳时机

给定一个数组 prices ,它的第i个元素prices[i]表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

package input_output;
import java.util.Scanner;

public class maxprofit {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] a = sc.nextLine().split(",");
        int[] b = new int[a.length];
        for (int i = 0; i < b.length; i++) {
            b[i] = Integer.parseInt(a[i]);
        }
        System.out.println(max(b));
    }

    public static int max(int[] a) {
        int maxp = 0;
        for (int i = 0; i < a.length-1; i++) { //注意一定要减1
            for (int j = i + 1; j < a.length; j++) {
                int b = a[j] - a[i];
                if (b>maxp){
                    maxp=b;
                }
               // maxp=Math.max(maxp,b);
            }
        }
        return maxp;
    }
}

21.题目:使用最小花费爬楼梯(动态规划)

package input_output;
/*给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。

*/
import java.util.Scanner;
public class shit {

        public static int minCostClimbingStairs(int[] cost) {
            int[] dp=new int[cost.length+1];
            dp[0]=0;
            dp[1]=0;
            int i=0;
            for(i=2;i<=dp.length-1;i++){
                dp[i]=Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
            }
            return dp[cost.length];
        }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String[] s=sc.nextLine().split(",");
        int[] cost=new int[s.length];
        for (int i=0;i<s.length;i++){
            cost[i]=Integer.parseInt(s[i]);
        }
        System.out.println((minCostClimbingStairs(cost)));
    }
    }

22.题目:StringBuffer,StrungBuilder的区别

1.都是final类,不允许被继承,主要是从性能和安全性上考虑的

2.StringBuffer是线程安全,可以不需要额外的同步用于多线程中;

3.StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了

String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

23.题目:最长回文子串

package input_output;
/*最长回文子串
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
输入:s = "cbbd"
输出:"bb"
*/
public class huiwen {
    public static boolean ishuiwen(String s) {
        int mid = s.length() / 2;
        int j = s.length();
        for (int i = 0; i < mid; i++) {
            if (s.charAt(i) != s.charAt(j - i - 1)) {
                return false;
            }
            //也可以j--;
        }
        return true;
    }

    public static String zuida(String t) {
        String ans = "";
        String sub = "";
        int max = 0;
        for (int i = 0; i < t.length(); i++) {
            for (int j = i + 1; j < t.length(); j++) {
                ans = t.substring(i, j);
                if (ishuiwen(ans) && ans.length() > max) {
                    sub = t.substring(i, j);
                    max = Math.max(max, ans.length());
                }
            }
        }
        return sub;
    }

    public static void main(String[] args) {
        System.out.println(zuida("sndabadhdn"));
    }
}

24.题目: List和ArrayList的区别

List是一个接口,而ArrayList是List接口的一个实现类

ArrayList类继承并实现了List接口

//尽量用
List list = new ArrayList()

问题的关键:为什么要用List list = new ArrayList(),而不用ArrayList alist = new ArrayList()呢?

问题就在于List接口有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如LinkedList或者Vector等等,这时你只要改变这一行就行了: List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。

假设你开始用ArrayList alist = new ArrayList(), 这下你有的改了,特别是如果你使用了ArrayList实现类特有的方法和属性。

这样的好处是为了代码的可维护性,可复用性,可扩展性以及灵活性,再者就是这符合了里氏代换原则和开闭原则。

25.题目:判断字符串是否回文字符串(直接调用函数Reverse)

package input_output;
import java.util.Scanner;
public class hui {
/*判断回文字符串
  String转换为StringBUffer: StringBuffer t=new StringBuffer(str);
  StringBuffer有reverse函数,调用之后直接在原来的字符串上更改
  t.reverse();  不用再赋值
  跟字符串判断相等StringBuffer类型的需要ToString转换为String类型的
 */
    public static Boolean ishui(String s){
        StringBuffer t=new StringBuffer(s);
        t.reverse();
        if(t.toString().equals(s)){
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
        System.out.println(ishui(s));
    }
}

26.题目:反转链表(指针跟栈)

package input_output;
import java.util.Stack;
public class reverse {
    public class ListNode {
        int val;
        ListNode next;
        ListNode() {
        }
        ListNode(int val) {
            this.val = val;
        }
        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }
//指针反转
    public static ListNode re(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        ListNode temp = null;
        while (cur != null) {
            temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
//用栈的方法
    public static ListNode zhan(ListNode head) {
        Stack<ListNode> s = new Stack<>();
        while (head != null) {
            s.push(head);
            head = head.next;
        }
        if (s.isEmpty()) {
            return null;
        }
        ListNode cur = s.pop();
        ListNode temp = cur;
        while (!s.isEmpty()) {
            temp.next = s.pop();
            temp = temp.next;
        }
        return cur;
    }
}

二、使用步骤

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值