第一题 镜像字符串
给一个序列x,如果x和它的逆序列y的每一位都是镜像关系,则输出“yes”否则输出“no”
1镜像1,2镜像5,3镜像8,4镜像7,6镜像9。
输入:
3
69
6996
1111
输出
yes //69和96是
no //6996和6996不是 因为6必须对应9
yes //1111和1111是 1和1对应
思路:就是用StringBuilder直接逆序,然后逐位比较即可…不知道为什么很多人没a
一开始我只a了0.1,因为StringBuilder反转的时候不是生成新对象而是把原来的翻转然后返回,后来idea调试发现了
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//获取输入的行数
int n = scanner.nextInt();
//解决输入格式问题
scanner.nextLine();
//逐个处理
for(int i=0;i<n;i++){
String input = scanner.nextLine();
//原字符串
StringBuilder oriSB = new StringBuilder(input);
//翻转后字符串
StringBuilder revSB = new StringBuilder(input).reverse();
//定义boolean值表示是否镜像 初始true
boolean b=true;
//逐位判断 因为要全部满足 一个不满足可跳出
for(int j=0;j<oriSB.length();j++){
char c1 = oriSB.charAt(j);
char c2 = revSB.charAt(j);
if(c1=='1'&&c2!='1'){//一个为1,另一个必须为1,下同
b=false;
break;
}else if(c1=='2'&&c2!='5'){
b=false;
break;
}else if(c1=='5'&&c2!='2'){
b=false;
break;
}else if(c1=='3'&&c2!='8'){
b=false;
break;
}else if(c1=='8'&&c2!='3'){
b=false;
break;
}else if(c1=='4'&&c2!='7'){
b=false;
break;
}else if(c1=='7'&&c2!='4'){
b=false;
break;
}else if(c1=='6'&&c2!='9'){
b=false;
break;
}else if(c1=='9'&&c2!='6'){
b=false;
break;
}
}
if(b)
System.out.println("YES");
else
System.out.println("NO");
}
}
}
也可以用HashMap
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//获取输入的行数
int n = scanner.nextInt();
//解决输入格式问题
scanner.nextLine();
//逐个处理
for(int i=0;i<n;i++){
String input = scanner.nextLine();
//原字符串
StringBuilder oriSB = new StringBuilder(input);
//翻转后字符串
StringBuilder revSB = new StringBuilder(input).reverse();
//定义一个hashmap,存放值和对应的镜像值
HashMap<Character,Character> map=new HashMap<>();
map.put('1','1');
map.put('2','5');
map.put('5','2');
map.put('3','8');
map.put('8','3');
map.put('4','7');
map.put('7','4');
map.put('6','9');
map.put('9','6');
//定义boolean值表示是否镜像 初始true
boolean b=true;
//逐位判断 因为要全部满足 一个不满足可跳出
for(int j=0;j<oriSB.length();j++){
char c1 = oriSB.charAt(j);
char c2 = revSB.charAt(j);
if(map.get(c1)!=c2){
b=false;
break;
}
}
if(b)
System.out.println("YES");
else
System.out.println("NO");
}
}
}
第二题 统计拆分字符串添加±号得到结果的个数
输入:
2
21 1
12345 3
输出
1 //2-1=1
1 //1-2+3-4+5=3
思路:动态规划 从最后一位开始处理
例如123 15,会判断12能否组成12(15-3)或18(15+3)(×),1和23能否组成15(×),123能否组成15(×)。
然后12能否组成12会判断,1能否组成14(12+2)或10(12-2),12能否组成12(✔)。
建议草稿纸上画一画就明白了
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//获取输入的行数
int n = scanner.nextInt();
//解决输入格式问题
scanner.nextLine();
//逐个处理
for(int i=0;i<n;i++){
String[] input = scanner.nextLine().split(" ");
String str=input[0];//数字字符串
int target=Integer.parseInt(input[1]);//目标数字
System.out.println(solution(str,str.length()-1,str.length()-1,target));
}
}
private static int solution(String str,int i,int j,int target){
int result=0;
for(int m=i;m<=j;m++){
result=result*10+(str.charAt(m)-'0');
}
if(i==0){
if(target==result)
return 1;
return 0;
}
int count=solution(str,i-1,i-1,target-result)+
solution(str,i-1,i-1,target+result)+
solution(str,i-1,j,target+result);
return count;
}
}