贪多嚼不烂,
今天就两题啦~
目录
1.连续最大和
①题目示例:
②方法解析一:(利用动态规划解决问题)
举个例子讲一下动态规划:
a.什么是状态方程式?
b.结合代码进行讲解
详细代码:
import java.util.*; public class Main1{ public static int getMax(int a,int b){ return a>b?a:b; } public static void main(String[]args){ Scanner sc=new Scanner(System.in); //第一步输入的值即为数组的大小 int size=sc.nextInt(); //再判断好数组的大小后,第二步依次输入数据,构建好这个数组 int tmp[]=new int[size]; for(int i=0;i<size;i++){ tmp[i]=sc.nextInt(); } //就利用动态规划思想来求解 //记录下最开始的情况,后面若sum的值大于max,就把值赋给max,最终用max来记录 int sum=tmp[0]; int max=tmp[0]; for(int i=1;i< tmp.length;i++){ //①比较当前数据的值与当前数据之前所有和的值的大小,这里是一个状态方程 sum=getMax(sum+tmp[i],tmp[i]); //所得到的较大值还需要与之前所确定的较大值进行比较筛选出更大的值 if(sum>=max){ max=sum;//因为是用max来存放最终的最大值 } } System.out.println(max); } }
③方法解析二:(仍然是利用动态规划解决问题)
此时利用的动态规划,和我们前面提及到的动态规划不大一样,这里的是指,随着i的移动,若i的前一位>0,这一位才加上前一位,否则不加,举个例子(这是在前面刷题的时候举的例子,再次使用)
代码:
import java.util.*; public class Main1{ public static void main(String[]args){ Scanner sc=new Scanner(System.in); int size = sc.nextInt(); int[] array = new int[size]; int Max=0; for(int i = 0; i< size;i++) { array[i] = sc.nextInt(); //因为在这里才输入,实质上相当于这里给Max赋予初始值 Max=array[0]; } for(int i=1;i<array.length;i++){ if(array[i-1]>0){ array[i]+=array[i-1]; }//每次找出当前以来最大的数来进行进一步的比较 Max=Math.max(Max,array[i]); } System.out.println(Max); } }
2.统计回文
①题目示例:
②方法解析:
按照题意 我们应该首先把字符串二插入字符串一中,但由于要插入多次,若是我们一直都在原字符串中进行删改,那么这是非常复杂的。因此,我们引入一个新的字符串,使得它引用字符串一,用此字符串来进行判断是否是回文结构。而要判断回文结构,这里有两种方式进行,方法一是直接进行逆置函数,通过string类型的equals方法,我们可以直接判断出两者是否一致,若是一致,则是回文,反之,则不是。方法二,外设一个函数来用双指针进行逆转,当判断是回文结构时,count➕➕,最后返回count的值即可。
代码:
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++) { //先创建一个新的StringBuffer对象,把str1的引用放入其中 // 将字符串2插入到字符串1的每个位置,再判断是否是回文 StringBuffer str = new StringBuffer(str1); //下一行代码的意思是:在i位置,插入str2这个字符串 str.insert(i, str2); //注意这里,不能直接StringBuilder str5 = str.reverse(); //因为这样str本身又变了。所以需要创建一个临时的变量字符串tmp StringBuilder tmp = new StringBuilder(str); StringBuilder str5 = tmp.reverse(); //逆置之后,我们可以根据equals方法来对是否是回文结构来进行判断。但是 //StringBuilder和StringBuilder是没有equals方法的,而String有,所以我们先把其转换为字符串,再进//一步进行转换 if (str.toString().equals(str5.toString())) { //对回文结构进行计数 n++; } } System.out.println(n); } }