局部代码重复执行

  • 给定一个长度为 n 的序列 a ,请你构造一个序列 b ,序列 b 满足以下条件:
    1.序列 b 的长度为 n
    2.对于任意 i ∈[1, n],满足 ( ai+ bi ) mod i = 0
    3.对于任意i ∈[1, n],满足 1 ≤bi ≤10^9
    4.对于任意1≤i<j≤n,满足 bi≠ bj

  • 输入描述:
    第—行输入一个整数 n (1 ≤n ≤105)
    第二行输入n个整数,第i个为 ai (1 ≤ai≤106)

  • 输出描述
    输出n个整数,表示答案。
    若有多个不同的答案,输出所有结果。

  • 输入:
    5
    3 4 7 8 10

  • 输出:
    1 6 2 4 5

  • 算法步骤
    输入 n。
    输入 n 个整数作为序列 a。
    初始化一个空的集合 used 来存储已经使用过的 bi。
    初始化一个空的序列 b。
    从 i = 1 开始循环到 i = n:
    a. 计算当前位置的 bi = i - a[i-1],确保 bi 大于等于 1。
    b. 如果 bi 已经在集合 used 中,就将 bi 增加 i,直到 bi 不在 used 中为止,以保证 bi 不会重复。
    c. 将 bi 添加到集合 used 中。
    d. 将 bi 添加到序列 b 中。
    输出序列 b。

import java.util.*;

public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        long[] a = new long[n+1];
        long[] b = new long[n+1];

        for(int i=1;i<=n;i++){
            a[i]=scanner.nextLong();
        }

        for(int i=1;i<a.length;i++){
            System.out.print(a[i]+" ");
        }

        Set<Long> used = new HashSet<>();

        for(int i=1;i<=n;i++){
            long num = i - a[i];
            while (true) {
                if (num >= 1 && !used.contains(num) ) {
                    used.add(num);
                    b[i] = num;
                    break;
                } else {
                    num += i;
                }
            }
        }
        for(int i=1;i<b.length;i++){
            System.out.print(b[i]+" ");
        }
    }
}
  • Set used = new HashSet<>();当作new了一个新的日志。
  • 局部循环用while-break;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值