腾讯2018春招技术类编程题2

   既然不能解决眼前的苟且,就先把诗和远方放一放!加油吧,我的喵小姐!


2、纸牌游戏

首先认真看题:1)时间限制为1s,不适合用循环;2)双方均最优-即如果是按从大到小的顺序排下来,则应该是一正一负依次加起来即可。所以现在问题的关键就是如何使输入的数据有序?此时,我首先想到的是各种排序方法,但是它们均用到了循环,时间上肯定不满足,而且依我自己的直觉,总觉得不能使用内置的排序函数,所以尽管不能用循环,我也只能用循环了...


import java.util.Scanner;

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

		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int a[]=new int[n];
		int i,j,temp,sum=0;		
		for(i=0;i<n;i++){
			a[i]=sc.nextInt();
		}
	
		for(i=0;i<n-1;i++){//冒泡排序
			for(j=i+1;j<n;j++){
				if(a[i]<a[j]){
					temp=a[i];
					a[i]=a[j];
					a[j]=temp;
				}
			}
			if(i%2==0){
				sum=sum+a[i];
			}else{
				sum=sum-a[i];
			}	
		}
		if(n%2==0){//最后一个数
			sum=sum-a[i];
		}else{
			sum=sum+a[i];
		}
        System.out.println(sum);   
	}
}

嗯,没错,确实不满足时间要求!

然后我开始查网上各种排序方法,看哪个时间复杂度最低,但是不管哪个,绝对时间上都不满足,于是在网上搜其他人怎么做,关键看大家是如何排序的?因为如果不能使用内置函数的话,我觉得只能用排序方法,而各种排序都会超时,结果我发现原来大家都是用的内置函数,即Arrays.sort()

import java.util.Scanner;
import java.util.Arrays;

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

		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int a[]=new int[n];
		int i,sum=0;	
                int flag=1;//控制符号
		for(i=0;i<n;i++){
			a[i]=sc.nextInt();
		}

	        Arrays.sort(a);//得到的数组是按从小到大排列的
		for(i=n-1;i>=0;i--){//最后一个数是最大的,为正,依次为负、正...
                    sum=sum+a[i]*flag;
	            flag=flag*(-1);
		}
        System.out.println(sum);   
	}
}

over!所有样例运行正确

(接下来要好好做一次各种排序的总结了!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值