计挑赛初赛试题(2020)(二)

题目描述:

在一个由小写英文字母(a-z)组成的字符串中,查找最长子串,其头尾字母相同,且中间不包含该头尾字母,并输出最左边的该类子串。

输入说明:1行,为待处理字串(长度≤200)。

输出说明:一行,为满足条件的子串

输入样例:adfasjdoiasldhlfa

输出样例:fasjdoiasldhlf

解题思路:先获取到字符串的首元素然后循环向后对比,遇到相同的就说明找到了一个子字符串,然后判断长度是否为最长的,如果一直到最后都没有相同的就返回首字符

import java.util.*;

public class Main{
	public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        String s = sc.next();
        String max = "";
        for (int i = 0; i < s.length(); i++) {
        	//获取首字符
            String now = s.charAt(i) + "";
            for (int j = i+1; j < s.length(); j++) {
            	//如果到了最后也没有相等的,就返回首字符
                if (j == s.length() - 1 && s.charAt(i) != s.charAt(j)){
                	now = s.charAt(i) + "";
                    break;
                }
                //如果遇到相等的就添加该字符串 .substring [i,j+1)
                if (s.charAt(i) == s.charAt(j)){
                	now = s.substring(i,j+1);
                    break;
                }
            }
            //判断字符串长度
            if (now.length() > max.length()){
            	max = now;
            }
        }
        System.out.println(max);
    }
}

题目描述

某商品有2种不同数量的包装,对应不同的价格;同时提供满200元减50元的不限量购物券,试求解最佳购买策略,在单次购买中以最低总价购买正好500个商品

输入说明

输入1行,为空格分隔的2个整数,分别表示两种包装的数量和价格(均为整数)

输出说明

输出1行,为空格分隔的2个整数,分别表示两种商品各自购买包数(无解则输出:-1)

输入样例

100 80 200 150

输出样例

5 0

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int count1 = sc.nextInt();
        int price1 = sc.nextInt();
        int count2 = sc.nextInt();
        int price2 = sc.nextInt();
        //这里的min值无所谓,它是用来存放最小的
        int min = 10000, res1 = 0, res2 = 0;
        boolean flag = false;
        for ( int i = 0; i <= 500/count1; i++ ) {
            //凑不成500的情况
            if ( (500-i*count1) % count2 != 0 )
                continue;
            int temp = i * price1 + ( 500 - i * count1 ) / count2 * price2;
            //满200-50
            temp = temp - (temp / 200 * 50);
            if ( temp < min ) {
                min = temp;
                res1 = i;
                res2 = ( 500 - res1 * count1 ) / count2;
                flag = true;
            }
        }
        if (flag){
            System.out.println(res1+" "+res2);
        }else{
            System.out.println(-1);
        }
    }
}

 题目描述:仓库新进了几批物资,只知道每批物资的数量和单价,请编写程序,按照每种物资的总价值,由高到低次序输出。
输入说明:第1行一个整数N,表明物资的批次数量
第2~N+1行,每批物资的类别、数量及单价,中间用空格隔开,其中类别用A-Z加以区分。
输出说明:按物资价值降序输出排序结果,每行输出—种物资。
输入样例:5
A 5 10.00
B 3 2.00
A 5 8.00
B 3 2.50
C 10 3.50
输出样例:
A 90.00
C 35.00
B 13.50

解题思路:它的输出符合键值对的形式,用HashMap来解决,将序号和总值加入map,根据序号查找,如果map中存在该序号就累加总值

然后实现HashMap的排序!!!

import java.util.*;
import java.util.Map.Entry;

public class Main{
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		HashMap<String,Float> hashMap = new HashMap<>();
		int n=sc.nextInt();
		for(int i=0;i < n; i++) {
			//分别获取每次输入的序号和总值
			String key=sc.next();
			//数量
			int amount=sc.nextInt();
			//单价
			float value=sc.nextFloat();
			//总值
			float worth=amount*value;
			//如果序号已经存在则将总值累加
			if (hashMap.get(key)!=null) {
				worth+=hashMap.get(key);
			}
			hashMap.put(key, worth);
		}
		//将hashmap中每一个键值对作为一个值存入list
		List<Map.Entry<String,Float>> list = new ArrayList<>(hashMap.entrySet());
		//调用sort方法重写Comparator
		list.sort(new Comparator<Map.Entry<String,Float>>() {

			@Override
			public int compare(Entry<String, Float> o1, Entry<String, Float> o2) {
				//实现降序
				return o2.getValue().compareTo(o1.getValue());
			}
		});
		for (Map.Entry<String,Float> m : list) {
            System.out.println(m.getKey() + ":" + m.getValue());
        }
	}
}

题目描述

某饮料店有两种奶茶饮料,其中一种每瓶含奶粉15g含茶粉5g,另一种每瓶含奶粉10g含茶粉10g。设某天饮料店消耗的奶粉和茶粉重量分别为x和y(单位g)求当天饮料店两种饮料的销量。

输入说明

输入1行,2个用空格分隔的整数,分表表示奶粉和茶粉的消耗量。

输出说明

输出1行,为2个用空格分割的整数,分别表示两种饮料各自销量(无解则输出:-1)

输入样例

400 300

输出样例

10 25

解题思路:一元二次方程求解 奶粉量x=15m+10n,茶粉量y=5m+10n。解得m=(x-y)/10,n=(3*y-x)/20。

因为是刚好用完所以不可能有小数和负数的情况

import java.util.*;
public class Main{
    public static void main (String[] args){
    	Scanner sc = new Scanner(System.in);
    	float x = sc.nextInt();
    	float y = sc.nextInt();
    	//奶粉销量
    	float m =( x - y ) / 10;
    	//茶粉销量
    	float n = (3*y - x) / 20;
    	//不能有小数
    	if (m != (int)m || n != (int)n){
    		System.out.print(-1);
    		return;
    	}
    	if (m >= 0 && n >= 0)
    		System.out.print((int)m+ " "+(int)n);
    	else
    		System.out.print(-1);
    }
}

题目描述

小明设计了一种基于质数(2、3、5、7、11…)的变进制数,第一位为2进制,第二位为3进制,第三位为5进制,以此类推。请将该变进制数转化为十进制数

输入说明

输入1行,最大10位的变进制数(只使用0-9,a-z表示每一位数,a为10、b为11、…、z为35,测试数据中无大于z的单位数)。

输入说明

输入1行,最大10位的变进制数(只使用0-9,a-z表示每一位数,a为10、b为11、…、z为35,测试数据中无大于z的单位数)。

输入样例

321

输出样例

23

数据范围提示

(说明样例,321→3*(3*2) + 2*(2) +1=23

解题思路:第一位2进制对应的十进制值为1,第二位3进制对应的十进制值为:之前进制值之积,即2*1;第三位4进制对应的十进制值为:之前进制值之积,即3*2*1;以此类推

输入字符串对应位数转化的值为:字符对应值*之前进制之积,累加每位结果输出。

import java.util.Scanner;

public class Main{

    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int num[] = {1, 2, 6, 30, 210, 2310, 30030, 510510, 9699690, 223092870};
        long ans=0,temp=0;;
        String str = sc.next();  
        for(int i=str.length()-1; i>-1; i--){	  
        	//查询当前位数对应的单位十进制值(之前进制之积)
        	int index = num[str.length() - 1 - i]; 
        	//如果是0-9之间转换为数字,再乘以index
            if(str.charAt(i)>47&&str.charAt(i)<58){    
                temp = str.charAt(i)-48;  
                ans+= temp*index;    
            }else{  
            	//小写字母转换为10-35的值,再乘以index
                temp =str.charAt(i)-87;
                ans+= temp*index;
            }
        }
         System.out.println(ans);
    }
}

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

1while(true){learn}

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

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

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

打赏作者

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

抵扣说明:

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

余额充值