腾讯2018年春招技术类编程题_翻转数列_纸牌游戏_小Q的歌单

本文探讨了三个具体的算法问题:翻转数列求和的优化,纸牌游戏中最大差值的计算,以及小Q歌单中歌曲组合的可能性。通过深入分析,提供了高效的解决方案,包括使用数学公式简化复杂计算,利用数据结构进行排序和迭代,以及采用组合数方法解决复杂问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

翻转数列1

简单模拟(超时)

import java.util.*;

public class Main {
    static Scanner sc = new Scanner(System.in);
    public static void main(String[] args){
        long n,m;
        n = sc.nextInt();
        m = sc.nextInt();
        long sum =0;
        long k = 1;
        long symbol = 1;
        if(m==1)
        for(long i=1;i<=n;i++,k++){
            if(k==m){symbol*=-1;k=0;}            
            sum+= (i * symbol);
            //System.out.println(i * symbol);
        }
        else
            for(long i=1;i<=n;i++){
            if(i%m==1){symbol*=-1;}            
            sum+= (i * symbol);
            //System.out.println(i * symbol);
        }
        System.out.println(sum);
    }
}

找前 n 项和公式

没一个【负,正】为一组,以哦那个有 n/2m 组。开头是负数。
对于其中任意一组有 -x,-(x+1),-(x+2)…-(x+m-1), (x+m),(x+m+1),…,(x+2m-1);
本组各项相加:
原式 = -x+ -(x+1) + … + -(x+m-1) + x+m + x+m+1 + … + x+2m+1
=-x+(x+m) + -(x+1)+(x+1+m) + -(x+2)+(x+2+m) + … + -(x+m-1)+(x+2m-1)
=-m+m+m+…+m ······ 即m个m相加
=(m*m)
=m2
一共有n/2m组,故前n项和
S = m2n/2m = mn/2.

import java.util.*;

public class Main {
    static Scanner sc = new Scanner(System.in);
    public static void main(String[] args){
        long n,m;
        n=sc.nextLong();
        m=sc.nextLong();
        System.out.println(m*n/2);
    }
}

纸牌游戏2

import java.util.*;

public class Main{
    static Scanner sc = new Scanner(System.in);
    public static void main(String []args){
        int n = sc.nextInt();
        List<Integer> list = new ArrayList<>();
        for(int i=0;i<n;i++){
            list.add(sc.nextInt());
        }
        Collections.sort(list, Collections.reverseOrder());
        Integer difference = 0;
        Iterator<Integer> it = list.iterator();
        while(it.hasNext()){            
            difference += it.next();
            if(it.hasNext()) difference -= it.next();
        }
        
        System.out.println(difference);
    }
}

小Q的歌单3

主要参考了组合数的方法。4

import java.util.Scanner;

class Solution {

    long c[][] = new long[105][105];
    final int mod = 1000000007;

    void init() {
        c[0][0] = 1L;
        for (int i = 1; i <= 101; i++) {
            c[i][0] = 1;
            for (int j = 1; j <= i; j++)
                c[i][j] = (c[i - 1][j] % mod + c[i - 1][j - 1] % mod) % mod;
        }
    }

    long judge(int k, int a, int x, int b, int y) {
        long ans = 0;
        for (int i = 0; i <= x; i++) {
            if ((i * a <= k) && ((k - i * a) % b == 0) && ((k - i * a) / b <= y)) {
                ans = (ans + (c[x][i] * c[y][(k - i * a) / b]) % mod) % mod;
            }
        }
        return ans;
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int k;
        int a, b, x, y;
        k = sc.nextInt();//歌单总长度
        a = sc.nextInt();//第一种长度
        x = sc.nextInt();//第一种数量
        b = sc.nextInt();//第二种长度
        y = sc.nextInt();//第二种书量
        Solution solution = new Solution();
        solution.init();
        System.out.println(solution.judge(k, a, x, b, y));
    }
}

用到的取模公式5

(a + b) % p = (a%p + b%p) %p
(a - b) % p = ((a%p - b%p) + p) %p


  1. 翻转数列 ↩︎

  2. 纸牌游戏 ↩︎

  3. 小Q的歌单 ↩︎

  4. yue_jijun 腾讯笔试题--------小Q的歌单 ↩︎

  5. HyperDai 取模运算总结 - 数论 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值