题目描述:
在一个由小写英文字母(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);
}
}