蓝桥杯31天冲刺 Day17

蓝桥杯31天冲刺 Day17

距离和

链接: 距离和.
在这里插入图片描述
提取字符串中的字符,逐个相减。因为要求距离,值不能为负。每次算出来的结果取绝对值就好

完整代码:

public class 距离和 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        String s = "LANQIAO";
        int sum=0;
        for(int i=0;i<s.length();i++){
        	for(int j =i;j<s.length();j++){
        		sum+=Math.abs(s.charAt(i)-s.charAt(j));
        	}
        }
        System.out.println(sum);
	}
}

错误票据

链接: 错误票据
在这里插入图片描述
题意主要是说找到一串数字中的缺失和重复的数字

乍一看还蛮简单的,但是输入方式是给N行打乱的数字,所以最佳解决方案就是直接在读取数据的时候直接计算出结果,其实不用将数字排序就可以计算出结果

  • 重复数字的寻找方法:把接收到的数字存入set中,判断一下是否有重复就好了
  • 缺失数字的寻找方法:由于是一连串数字,我们可以找到数列中的最大,最小值,再用等差数列求和公式得出未重复,缺失时数列的和,再减去sum-n就可以得到结果

其实还有一个比较典型的问题,我们接收一行数据,用sc.nextLine()时会接收掉回车,而nextInt()就不会。这一点一定要注意

完整代码:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class 错误票据 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        int N = Integer.parseInt(s);
        int sum=0;
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        int n=0;
        int m=0;
        Set<Integer> set = new HashSet<>();
        for(int i =0;i<N;i++) {
        	s = sc.nextLine();
        	String[] chars = s.split(" ");
        	for(int j =0;j<chars.length;j++) {
        		int num = Integer.parseInt(chars[j]);
        		sum+=num;
        		if(num<min) {
        			min=num;
        		}
        		if(num>max) {
        			max = num;
        		}
        		if(set.contains(num)) {
        			n = num;
        		}
        		set.add(num);
        	}
        }
        m = (max-min+1)*(max+min)/2 - (sum-n);
        System.out.println(m+" "+n);
 	}
}

倍数问题

链接: 倍数问题.
在这里插入图片描述
大致思路就是对数字取余,保存不同余数前三大的数字,分情况讨论,从中循环选取数字凑取k的倍数

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
 
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int k=sc.nextInt();
        int []arr=new int[n];
        int []brr=new int[3*k];
        int []crr=new int [k];
        for(int i=0;i<n;i++){
          arr[i]=sc.nextInt();
        }
        Arrays.sort(arr);
        int s=0;
        for(int i=n-1;i>=0;i--){
          if(crr[arr[i]%k]<2){
            crr[arr[i]%k]++;
            brr[s]=arr[i];
            s++;
            if(s==3*k)
            break;
          }
        }
        long  count=0;
        for(int i=0;i<s-2;i++){
          if(brr[i]*3<=count){
            System.out.println(count);
            return;
          }
          for(int j=i+1;j<s-1;j++){
            if(brr[i]+brr[j]*2<=count){
              break;
            }
            for(int m=j+1;m<s;m++){
              if(brr[i]+brr[j]+brr[m]<=count){
                break;
              }
              if((brr[i]+brr[j]+brr[m])%k==0){
                count=Math.max(count,brr[i]+brr[j]+brr[m]);
                break;
              }
            }
          }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值