算法题(一):序列和

题目描述
给出一个正整数N和长度L,找出一段长度大于等于L的连续非负整数,他们的和恰好为N。答案可能有多个,我我们需要找出长度最小的那个。
例如 N = 18 L = 2:
5 + 6 + 7 = 18
3 + 4 + 5 + 6 = 18
都是满足要求的,但是我们输出更短的 5 6 7
输入描述:

输入数据包括一行: 两个正整数N(1 ≤ N ≤ 1000000000),L(2 ≤ L ≤ 100)

输出描述:

从小到大输出这段连续非负整数,以空格分隔,行末无空格。如果没有这样的序列或者找出的序列长度大于100,则输出No

示例1
输入

18 2

输出

5 6 7

本题解题思路:可以把此题解读为数列的知识,就是求解能够满足长度大于等于L的数列和N。

连续的序列,公差d为1 等差数列的求和公式:Sn=n*(a1+an)/2 转换下,则Sn=(n*(2a1+n-1)/2
可以求出对应的a1=(2
Sn+n-nn)/(2n)

代码:

import java.util.Scanner;
public class Main{
	public static void main(String[] args){
		Scanner input = new Scanner(System.in);
		int n= input.nextInt();
		int l=input.nextInt();
		boolean flag = false;
		for(int i=l;i<=100;i++){
			if((2*n+i-i*i)%(2*i)==0){
				flag = true;
				int a=(2*n+i-i*i)/(2*i);
				if(a<0) 
					continue;
				for(int j=0;j<i-1;j++){
					System.out.print(a+" ");
					a++;
				}
				System.out.print(a);
				break;
			}
		}
		if(flag==false){
				System.out.print("No");
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面为您提供一道 Java 算法目描述: 给定一个字符串,找出其中最长的无重复字符子串,并返回其长度。 示例: 输入: "abcabcbb" 输出: 3 解释: 最长的无重复字符子串是 "abc",长度为 3。 输入: "bbbbb" 输出: 1 解释: 最长的无重复字符子串是 "b",长度为 1。 输入: "pwwkew" 输出: 3 解释: 最长的无重复字符子串是 "wke",长度为 3。 请注意,答案必须是一个子串,"pwke" 是一个子序列 而不是子串。 解思路: 这道可以用滑动窗口算法来解决。首先定义一个窗口,用两个指针 left 和 right 来表示窗口的左右边界。然后,我们可以移动 right 指针来扩展窗口,直到遇到重复字符为止。此时,我们记录下当前窗口的长度,并将 left 指针移动到重复字符的下一个位置。同时,我们还需要记录下每个字符最后一次出现的位置,以便在遇到重复字符时快速将 left 指针移动到正确的位置。最后,我们可以不断地移动 right 指针,重复上述过程,直到 right 指针到达字符串末尾。 Java 代码实现: ``` public int lengthOfLongestSubstring(String s) { if (s == null || s.length() == 0) { return 0; } int n = s.length(); int maxLen = 0; Map<Character, Integer> map = new HashMap<>(); for (int left = 0, right = 0; right < n; right++) { char c = s.charAt(right); if (map.containsKey(c)) { left = Math.max(left, map.get(c) + 1); } map.put(c, right); maxLen = Math.max(maxLen, right - left + 1); } return maxLen; } ``` 以上就是本的解思路和 Java 实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值