1.进制转换(普及-)
这是我的麻烦的手动转换写法(而且还写了特别特别久因为对进制转换不熟):
import java.util.Scanner;
import static java.lang.Math.*;
public class Main {
public static void main(String[] args) {
StringBuilder num1 = new StringBuilder();
StringBuilder num2 = new StringBuilder();
Scanner sc = new Scanner(System.in);
//接收数据
int n = sc.nextInt();
num1.append(sc.next().toUpperCase());
int m = sc.nextInt();
long num = 0;
//将num1转为十进制
if (n != 10)
num = change1(n, num1);
else//WA了因为没有处理num1恰好为10进制的情况
num = Long.parseLong(num1.toString());//字符串与int/long等互相转化
//将十进制转为m进制
if (m != 10)
num2.append(change2(m, num));
else
num2.append(num1.toString().toUpperCase());
System.out.println(num2.toString().toUpperCase());
}
public static long change1(int n, StringBuilder sb) {
long num = 0;
for (int i = 0; i < sb.length(); i++) {
char c = sb.charAt(i);
if (c >= 'A' && c <= 'F') {
num += (long) ((c - 'A' + 10) * pow(n, sb.length() - i - 1));
} else {
num += (long) ((c - '0') * pow(n, sb.length() - i - 1));
}
}
return num;
}
public static String change2(int m, long num) {
StringBuilder sb = new StringBuilder();
while (num > 0) {
long a = num % m;
if (a >= 10) {
char c = (char) ('A' + a - 10);//WA了因为没有大写'A'
sb.append(c);
} else {
sb.append(a);
}
num /= m;
}
return sb.reverse().toString();
}
}
这是大大的优化解法(无需手动转换而且顺利AC)看来平时要养成经常查阅API帮助文档的习惯! 构造方法public BigInteger(String val,int radix) 将指定基数中的BigInteger的String表示形式转换为BigInteger。 字符串表示由可选的减号或加号后面是指定基数中的一个或多个数字的序列组成。字符到数字映射由Character.digit
提供。字符串可能不包含任何无关的字符(例如,空格)
import java.util.Scanner;
import java.math.BigInteger;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
// 接收数据
int n = sc.nextInt(); // 原始基数
String num1 = sc.next(); // 原始数
int m = sc.nextInt(); // 目标基数
// 将原始数转换为十进制
BigInteger decimal = new BigInteger(num1, n);//字符串num1必须和n基数相符!
// 将十进制数转换为目标基数
String result = decimal.toString(m);
System.out.println(result.toUpperCase());//使用toUpperCase()确保输出大写字母。
}
}
2.找筷子(普及-)
这是我一开始的写法,直接MLE了。
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];
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
}
int length=0;
//去除成双的筷子(赋值为0)
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(a[i]==a[j]){
a[i]=0;
a[j]=0;
continue;
}
}
length=a[i];
}
//寻找落单的筷子
for(int i=0;i<n;i++){
if(a[i]!=0)
length=a[i];
}
//输出
System.out.println(length);
}
}
改良版:使用异或的方法,因为有空间限制,所以不要用数组存储,最好是边输入边判断。而异或具有交换律与结合律的性质,因此可以直接使用。只要是去除出现次数为偶数,只有一个出现次数为奇数的,都可以用异或来解决。但是出现了一个以上就无法判断了。
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int num=0;
for(int i=0;i<n;i++){
num^=sc.nextInt();
}
System.out.println(num);
}
}
但是,就算优化了,java还是MLE!这是为什么?