2022 9.4 小红书笔试

一. ac

题目:

序列生成需要一个基础序列A,这个序列由n个 不大于100的数字组成,同时给定镜像复制次数m。
然后对于A进行m次镜像复制,例如序列A={1,2,3},则一次镜像复制后得到的序列是{1,2,3,3,2,1},两次镜像复制得到的序列是B={1,2,3,3,2,1,1,2,3,3,2,1} 。

现在给出你生成一个序列所需要的参数,请你计算该序列的第k位是多少。

输入第一行包含正整数个数n,镜像次数m,k;
输入第二行包含n个正整数;

3 3 10
1 2 3
输出:3

思路:

数学题,发现规律:例如1 2 3 ,不管镜像多少次,都是 1 2 3 3 2 1 一对的整数倍;
所以构造一个数组tmp用来存一对, tmp的length即为n*2;
用k 除以tmp的lenth,即取出重复的很多对,余数就是 k 在一个tmp中的索引;
由于索引从0开始,所以k需要减1;

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int m=in.nextInt();
        int k=in.nextInt();
        int[] nums=new int[n];
        for(int i=0;i<n;i++){
            nums[i]=in.nextInt();
        }
        //
        int[] tmp=new int[n*2];
        for(int i=0;i<n;i++){
            tmp[i]=nums[i];
        }
        int j=n;
        for(int i=n-1;i>=0;i--){
            tmp[j++]=nums[i];
        }
        int c=n*2;
        int lastindex=k%c-1;
        System.out.println(tmp[lastindex]);
    }
}

二. 通过0.81

题目:

给定n个整数a1, a2, a3 … an。每次操作可以选择其中一个数,
并将这个数加上1或者减去1。小红非常喜欢7这个数,他想知道至少需要多少次操作可以使这n个数的乘积为7?
1 ≤ n ≤ 30000,-109 ≤ ai ≤ 109

样例说明
5
-6 0 2 -2 3
输出6

第一次操作将a1减1,得到[-7,0,2,-2,3]
第二次操作将a4加1,得到[-7,0,2,-1,3]
第三次操作将a3减1,得到[-7,0,1,-1,3]
第四次操作将a5减1,得到[-7,0,1,-1,2]
第五次操作将a5减1,得到[-7,0,1,-1,1]
第六次操作将a2加1,得到[-7,1,1,-1,1],此时所有数的乘积为7;

思路:

首先要乘积为7,那么元素必然有一个7/-7,然后其他元素都是1/-1 ;
那么先选取数组中绝对值最大的数max,让max变成7,其他的元素变成1即可,注意这里让所有元素取Math.abs再和 7或者1比较,即得到差值也就是需要操作的次数!
由于最后必须是正的7,用od来记录正数还是负数,如果是负数,则结果要+2(即由-1变+1);

现在想起来,特殊情况,即当只有一个元素的时候,奇数+2就不对了! 这里改一下,应该能过更多!

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int[] nums=new int[n];
        int od=0;//奇偶
        for(int i=0;i<n;i++){
            nums[i]=in.nextInt();
        }
        //找到和7/-7差距最小的
        //累加其他的和1/-1差值
        int index=0;
        int[] res=new int[n];
        int max=Integer.MIN_VALUE;
        //找最大值
        for(int i=0;i<n;i++){
            if(max<Math.abs(nums[i]) ){
                max=Math.abs(nums[i]); //正数
                index=i;
            }
        }
        if(nums[index]<0){
            od++; //如果max小于0,od+1;
        }
        res[index]=Math.abs(max-7);
        // 除了index以外的,绝对值和1的差距
        for(int i=0;i<n;i++){
            if(i==index){ //跳过max
                continue;
            }
            if(nums[i]<0){
                od++; //记录奇偶数
            }
            res[i]=Math.abs(Math.abs(nums[i])-1);
        }
        int r=0;
        for(int i=0;i<n;i++){
            r=r+res[i];
        }
        if(od%2==0){ //偶数
            System.out.println(r);
        }else{ //奇数
            System.out.println(r+2);
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值