题目1.输入一个字符串,输入整数n,找出长度为n的相同字符构成的子串。
例如:输入:
字符串“abbbccccddeeffffaaaddzzz”,整数3
输出:
(1,3,bbb)
(16,18,aaa)
(21,23,zzz)
基本思路:该题使用两个指针,i指向下标为0处,j指向下标为1处,如果i 指向的字符与j指向的字符相同,那么将将j向后挪动一位,并将计数器加一,重复该操作直到i 和j 指向的字符不同为止,此时如果count值为输入的长度n,那么就打印出从下标i到下标 j-1的字符。然后将i的值赋给j,j=i+1,重复上面的操作。
代码实现:
public class Main { public static void main(String[] args) { int n = 3; String str = "abbbccccddeeffffaaaddzzz"; int i = 0; int j = 1; int count; char[] ch = str.toCharArray(); int N = ch.length - 1; while(j<=N&&i<=N) { count = 1; while(j<=N&&ch[i]==ch[j]) { count++; j++; } if(count==n) { System.out.print("("+i+","+(j-1)+","); for(int k=0;k<count;k++) { System.out.print(ch[i]); } System.out.print(")"); System.out.println(); } if(count>n) { i = j; j = i + 1; } else { i = i+ 1; j = i + 1; } } } }题目2:计算数组最大的连续子序列的和
如:{14,-2,4,-3,5,7,2,-39,22},和最大子序列是{14,-2,4,-3,5,7,2},返回27
思路一:暴力求解(时间复杂度n^2):
列举出所有的自序列的组合,将他们相加:
[14],[14,-2],[14,-2,4],[14,-2,4,3]..........
[-2],[-2,4],[-2,4,-3]..........
........
[22]
代码实现:
public class Main { public static void main(String[] args) { int[] a = {14,-2,4,-3,5,7,2,-39,22}; int N = a.length; int Max = Integer.MIN_VALUE; //取最小整数 int result; for(int i=0;i<N;i++) { result = 0; for(int j=i;j<N;j++) { result += a[j]; Max = Math.max(Max, result); } } System.out.println("最大值为:"+Max); } }
思路二:动态规划
思路:求n个数的数组的最大字段和,转为分别求以第1个、第2个........第n个数字结尾的最大字段和,再找出n个结果中最大的。
代码实现:
//数组的所有连续子段的最大和 public class Main { public static void main(String[] args) { int[] a = {14,-2,4,-3,5,7,2,-39,22}; maxSum(a,a.length); } public static void maxSum(int[] a,int n) { int[] dp = new int[a.length]; dp[0] = a[0]; for(int i=1;i<n;i++) { dp[i] = Math.max(dp[i-1]+a[i], a[i]); } //System.out.println(Arrays.toString(dp)); //取出dp数组中的最大值 int max = Integer.MIN_VALUE; for(int i=0;i<dp.length;i++) { if(dp[i]>max) max = dp[i]; } System.out.println(max); } }