算法训练---Day2

发布于:2022-12-20 ⋅ 阅读:(376) ⋅ 点赞:(0)

一:逆置字符串

链接:逆置字符串

1.题目

将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I

2.解题

2.1思路分析

先将整个字符串逆序,然后再将每个单词进行逆序即可。

在这里插入图片描述

2.2代码实现

java代码

import java.util.*;

public class Main{
    public static void reverse(char array[],int start,int end){
        while(start < end){
            char tmp = array[start];
            array[start] = array[end];
            array[end] = tmp;
            start++;
            end--;
        }
    }
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        char[] arr = str.toCharArray();
        reverse(arr,0,arr.length-1);
        int len = arr.length;
        int i = 0;
        int j = 0;
        while(i<len){
            while(j < len && arr[j] != ' '){
                j++;
            }
            if(j < len){
                reverse(arr,i,j-1);
                i = j+1;
                j++;
            } else {
                reverse(arr,i,j-1);
                i = j;
            }
        }
        String return_Str = new String(arr);
        System.out.println(return_Str);
    }
}

二:字符串相关

链接:统计回文

1.题目

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
例如:
A = “aba”,B = “b”。这里有4种把B插入A的办法:

  • 在第一个字母之前: “baba” 不是回文
  • 在第一个字母‘a’之后: “abba” 是回文
  • 在字母‘b’之后: “abba” 是回文
  • 在第二个字母’a’之后: “abab” 不是回文

所以满足条件的答案为2

2.解题

2.1思路分析

首先将字符串B插入到zifuchuanA的各个位置,提供两种思路:

1.使用字符串截取和拼接;

2.将String转化为StringBuffer,使用insert()方法。

然后判断,当前字符串是否是回文串,提供两种思路:

1.将当前字符串反转,判断是否与原来的字符串相同;

2.从两边开始,依次比较当前字符是否相同,直到比较到最中间的字符。

2.2代码实现

java代码

思路一:

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = sc.nextLine();
String str2 = sc.nextLine();
int len = str1.length();
int n = 0;
    for (int i = 0; i <= len; i++) {
    // 将字符串2插入到字符串1的每个位置,再判断是否是回文
    StringBuffer str = new StringBuffer(str1);
    str.insert(i, str2);
    //注意这里,不能直接StringBuilder str3 = str.reverse();
    //因为这样str本身又变了。
    StringBuilder tmp = new StringBuilder(str);
    StringBuilder str3 = tmp.reverse();
            if (str.toString().equals(str3.toString())) {
        n++;
        }
    }
System.out.println(n);
}
}

注意:

1.reverse()会使str也翻转;

2.StringBuffer类对象不能直接用equals()比较,而是需要先用toString()进行转化。

思路二:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    while(scanner.hasNextLine()){
    String s1 = scanner.nextLine();
    String s2 = scanner.nextLine();
    int len1 = s1.length();
    int len2 = s2.length();
    int sum = 0;
        for (int i = 0; i <= len1; i++) {
        String start = s1.substring(0,i);
        String end = s1.substring(i,len1);
        String target = start+s2+end;
        boolean flag = judgestr(target);
            if(flag == true){
            sum++;
            }
        }
    System.out.println(sum);
    }
}
    private static boolean judgestr(String target) {
        int len = target.length();
        int i = 0;
        int j = len-1;
            while(i < j){
            char c1 = target.charAt(i);
            char c2 = target.charAt(j);
                if(c1 != c2){
                return false;
                } else {
                  i++;
                  j--;
                  }
            }
        return true;
    }
}

三:动态规划问题

链接:连续最大和

1.题目

描述
一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3
输入描述:
输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。
输出描述:
所有连续子数组中和最大的值。

2.解题

2.1思路分析

典型的动态规划问题,关键是找到递推式。每次都寻找以array[i]结尾的最大和,遍历完整个数组后,找出所有最大和中最大的那个,就是问题的答案。

在这里插入图片描述

2.2代码实现

java代码

import java.util.Scanner;
public class Main {
    public static int GetMax(int a, int b){ 
    return (a) > (b) ? (a) : (b);
    }
        public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int size = scanner.nextInt();
        int[] array = new int[size];
            for(int i = 0; i< size;i++) {
            array[i] = scanner.nextInt();
            }
        int sum = array[0];
        int max = array[0];
            for(int i = 1;i < size;i++) {
            sum = GetMax(sum + array[i], array[i]); //状态方程式
            if (sum >= max)
                max = sum;
            }
    System.out.println(max);
    }
}

内容结束!

在这里插入图片描述