4.7日网易笔试代码(第一题)

题解:

思路:

A 等差数列

GCD(最大公约数,辗转相除法,注意Long)

将每两个连续数的差值视为一个新的数列,求GCD,如果有差值小于等于0,直接输出-1

多个数的最大公约数(模板):

//求数组a[]的最大公约数
 
int gcd(int a,int b)
{
	return b == 0 ? a : gcd(b, a % b);
}
 
temp = a[0];
for (i = 1; i < n ; i++)
{
	temp = gcd(temp,a[i]);
}
 
//temp即为所求最大公约数

在这里插入图片描述
在这里插入图片描述

代码:

// 超时
// import java.util.*;

// public class Main_1 {

//     public static void main(String[] args) {
//         Scanner sc = new Scanner(System.in);
//         while(sc.hasNextInt())
//         {
//             int n = sc.nextInt();
//             long a[] = new long[n + 1];
//             for(int i = 1; i <= n; i++)
//             {
//                 a[i] = sc.nextLong();
//             }
//             long max_value = 1000000000;
//             Set<Long> res = new HashSet<>();
//             for(long d = 1; d <= a[2]; d++)
//             {
//                 for(long k = 1; k <= a[2]; k++)
//                 {
//                     for(int i = 1; i < n; i++)
//                     {
//                         if((a[i + 1] - a[i]) / k == d)
//                         {
//                             res.add(d);
//                         }    
//                     }
//                 }
//             }
//             long ans[] = new long[res.size()];
//             int index = 0;
//             Iterator<Long> it = res.iterator();
//             while(it.hasNext())
//             {
//                 ans[index++] = it.next();
//             }
//             for(int i = 0; i < res.size(); i++)
//             {
//                 if(ans[i] != 1)
//                 {
//                     System.out.println(ans[i]);
//                     break;
//                 }
//             }
//             if(res.isEmpty())
//             {
//                 System.out.println(-1);
//             }
//         }
//     }    
// }

import java.util.*;

public class Main_1 {

    // 辗转相除法求最大公约数 gcd
    public static long gcd(long a, long b)
    {
        return b == 0 ? a : gcd(b, a % b);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt())
        {
            int n = sc.nextInt();
            long a[] = new long[n];
            List<Long> list = new ArrayList<>();
            for(int i = 0; i < n; i++)
            {
                a[i] = sc.nextLong();
                if(i >= 1)
                {
                    long temp = a[i] - a[i - 1];
                    if(temp <= 0)
                    {
                        System.out.println(-1);
                        return;
                    }
                    list.add(temp);
                }
            }
            if(list.size() == 0)
            {
                System.out.println(-1);
                return;
            }
            if(list.size() == 1)
            {
                System.out.println(list.get(0));
                return;
            }
            long res = list.get(0);
            for(int i = 1; i < list.size(); i++)
            {
                res = gcd(res, list.get(i));
            }
            System.out.println(res == 0 ? -1 : res);
        }
    }
}

// 输入用例1:
// 4
// 1 3 7 15
// 输出用例1:
// 2

// 输入用例2:
// 4
// 1 2 1 1
// 输出用例2:
// -1

参考:

  1. 【网易】2020春招Java开发实习生笔试题解
  2. 网易笔试四题代码交流
  3. 多个数的最大公约数(模板)
  4. 【系列】重新认识Java——基本类型和包装类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dev_zyx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值