字符串最大乘积
题目描述
已知一个字符串数组words,要求寻找其中两个没有重复字符的字符串,使得这两个字符串的长度乘积最大,输出这个最大的乘积。如:
words=["abcd","wxyh","defgh"], 其中不包含重复字符的两个字符串是"abcd"和"wxyh",则输出16
words=["a","aa","aaa","aaaa"], 找不到满足要求的两个字符串,则输出0
输入描述:
Input:
["a","ab","abc","cd","bcd","abcd"]
输出描述:
Output:
4
import java.util.*;
public class Main {
// 统计第一大
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String line = in.nextLine();
String[] words = line.substring(1, line.length() - 1).split(",");
int max = 0;
for (int i=0;i<words.length-1;i++){
for (int j=i+1;j<words.length;j++){
if (!isDup(words[i],words[j])){
// 这里主要原输入字符带双引号
int len = (words[i].length()-2) * (words[j].length()-2);
max = Math.max(max,len);
}
}
}
System.out.println(max);
}
// 判断两个字符串是否有重复字符
public static boolean isDup(String s1, String s2){
for (int i=0;i<26;i++){
String c = (char) ('a' + i) + "";
if(s1.contains(c) && s2.contains(c)){
return true;
}
}
return false;
}
}
今年的第几天
输入年、月、日,计算该天是本年的第几天。
输入:
包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。
输出:
输入可能有多组测试数据,对于每一组测试数据,
输出一个整数,代表Input中的年、月、日对应本年的第几天。
输入描述:
输入:1990 9 20
输出描述:
输入:263
import java.util.*;
public class Main {
// 统计第一大
static int[] months = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int year = in.nextInt();
int month = in.nextInt();
int day = in.nextInt();
int total = 0;
boolean leap = isLeap(year);
for (int i=1;i<month;i++){
if (leap && i == 2){
total += 1;
}
total += months[i];
}
System.out.println(total+day);
}
public static boolean isLeap(int year){
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
return true;
}
return false;
}
}
数字序列的第n位值
有一个无限长的数字序列1,2,2,3,3,3,4,4,4,4,5,5,5,5,5。。。(数字序列从1开始递增,且数字k在该序列中正好出现k次),求第n项是多少
输入描述:
输入为一个整数n
输出描述:
输出一个整数,即第n项的值
public class Main {
// 统计第一大
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int copy = n;
for (int i=1;i<=copy;i++){
n = n - i;
if (n <= 0){
System.out.println(i);
break;
}
}
}
}
a/b
求a/b的小数表现形式。如果a可以整除b则不需要小数点。如果是有限小数,则可以直接输出。如果是无限循环小数,则需要把小数循环的部分用"()"括起来。
输入描述:
两个整数a和b,其中
0 <= a <= 1000 000
1 <= b <= 10 000
输出描述:
一个字符串,该分数的小数表现形式
1 6
0.1(6)
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int c = a%b;//余数是本题的关键
int d = a/b;
System.out.print(d);//打印整数部分
if(c == 0) return;
System.out.print(".");//打印小数点
List<Integer> v1 = new ArrayList<>();//每一步的商数
List<Integer> v2 = new ArrayList<>();//每一步的余数,有相同余数的时候开始循环
v2.add(c);
boolean flag = true;//标记是否循环
int p = 0;//标记循环开始的位数
while(true){
// 这里只用乘以10 ,可以保存每一位0
int temp = 10*c;//每一步的余数乘10,变成下一步的被除数
int e = temp/b;
int f = temp%b;//这次的余数
v1.add(e);
if(f == 0){
flag = false;//除尽了,就不是循环小数
break;
}
if(v2.contains(f)) {
p = v2.indexOf(f);//标记循环开始的位数
break;
}
v2.add(f);
c = f;//更新余数
}
for(int i = 0; i < v1.size(); ++i) {//打印小数部分
if(flag && i == p) System.out.print("(");//循环开始时,打一个括号
System.out.print(v1.get(i));
}
if(flag) System.out.print(")");//循环小数收尾的括号
}
}
网友评论