【好未来20180828Java】给定一个正整数数组,找出和最大的子数组(升序),输出和

12345 能被3整除的个数?

12 3 45    3个
123 45    2个

 
package test0828;

import java.util.Scanner;

/**
 * @author wyl
 * @time 2018年8月28日下午8:12:07
 */
public class Main3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		char[] cs=scanner.nextLine().toCharArray();
		int res=0;
		int i=0;
		int tmp=0;
		while(i<cs.length){
			if ((cs[i]-'0')%3==0) {
				res++;
				i++;
			}else {
				tmp=cs[i]-'0';
				i++;
				while(i<cs.length){
					tmp=tmp*10+cs[i]-'0';
					if ((cs[i]-'0')%3==0||tmp%3==0) {
						res++;
						i++;
						break;
					}
					i++;
				}
			}
		}
		System.out.println(res);
	}

}

 

 

给定一个正整数数组,找出和最大的子数组(升序),输出和

如 5 1 3 4 9 7 6 8
 输出 23


所有可能: 5  9==14
          1 3 4 7 8=23

 

package test0828;

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

/**
 * @author wyl
 * @time 2018年8月28日下午8:48:12
 */
public class Main4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		while(scanner.hasNext()){
			int num=scanner.nextInt();
			int[] arr=new int[num];
			for(int i=0;i<num;i++){
				arr[i]=scanner.nextInt();
			}
			System.out.println(sum(arr,num));
		}
		scanner.close();
	}

	private static int sum(int[] arr, int num) {
		// TODO Auto-generated method stub
		int max=0;
		int res=0;
		ArrayList<Integer> list2=new ArrayList<>();
		
		for(int i=0;i<num;i++){
			list2.add(arr[i]);
			while(arr[++i]>arr[i]) {
				list2.add(arr[i]);
			}
			for(int j=0;j<list2.size();j++){
				res+=list2.get(j);
			}
			if (res>max) {
				max=res;
			}
			res=0;
		}
		
		return max;
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用回溯算法来解决这个问题。具体步骤如下: 1. 定义一个方法 backtrack(int[] nums, int target, int start, List<Integer> path, List<List<Integer>> res),其 nums 表示输入的正整数数组,target 表示目标和,start 表示从哪个位置开始搜索,path 表示当前的路径,res 表示最终的结果集。 2. 在 backtrack 方法,首先判断当前的路径是否满足条件,如果满足,则将其加入结果集。 3. 然后从 start 开始遍历数组,对于每个数,将其加入当前路径,更新目标和,然后递归调用 backtrack 方法。 4. 在递归调用完成后,需要将当前数从路径删除,同时将目标和恢复到之前的状态。 下面是 Java 代码实现: ``` public List<List<Integer>> findNsum(int[] nums, int target, int start, int N) { List<List<Integer>> res = new ArrayList<>(); int len = nums.length; if (N < 2 || len < N) return res; if (N == 2) { int left = start, right = len - 1; while (left < right) { int sum = nums[left] + nums[right]; if (sum == target) { List<Integer> path = new ArrayList<>(); path.add(nums[left]); path.add(nums[right]); res.add(path); while (left < right && nums[left] == nums[left + 1]) left++; while (left < right && nums[right] == nums[right - 1]) right--; left++; right--; } else if (sum < target) { left++; } else { right--; } } } else { for (int i = start; i < len - N + 1; i++) { if (i > start && nums[i] == nums[i - 1]) continue; List<List<Integer>> sub = findNsum(nums, target - nums[i], i + 1, N - 1); for (List<Integer> path : sub) { path.add(0, nums[i]); res.add(path); } } } return res; } ``` 其,findNsum 方法的参数分别表示:nums 表示输入的正整数数组,target 表示目标和,start 表示从哪个位置开始搜索,N 表示要找的数字个数。在方法,首先判断 N 的值,如果是 2,就使用双指针法查找满足条件的个数;否则,就递归调用 findNsum 方法,在问题查找 N-1 个数的和为 target-nums[i] 的路径,并将 nums[i] 加入路径,最后将路径加入结果集

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Baymax_wyl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值