B_Lin88’s Palindrome
package 训练;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class B2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();
char []ch=str.toCharArray();
long q=sc.nextInt();
int num=0;
long mid=(ch.length)%2==0?(ch.length)/2-1:(ch.length)/2;
for(int j=0;j<=mid;j++) {
if(ch[j]!=ch[ch.length-1-j]&&j!=ch.length-1-j) {
num+=2;
}
}
for(int i=0;i<q;i++) {
int s=sc.nextInt();
String c=sc.next();
if(ch.length%2==1&&s*2==ch.length+1) {
ch[s-1]=c.charAt(0);
if(num!=0) {
System.out.println("No");
continue;
}else {
System.out.println("Yes");
continue;
}
}else if (ch[ch.length-s] != ch[s-1]) {
if (ch[ch.length- s] == c.charAt(0)){
num-=2;
}
}else{
if (ch[ch.length-s] != c.charAt(0)){
num += 2;
}
}
ch[s-1] = c.charAt(0);
if (num != 0) {
System.out.println("No");
}
else {
System.out.println("Yes");
}
}
}
}
描述:
- 首先判断回文字符数组的下标中间值,如果是偶数则是数组长度除二减一,如果是奇数则是数组长度除二。如果输入的字符串对应位置不相等,赋予一个值num加二,即是不相等的回文字符个数。
- 如果是奇数字符串数组且遍历到最中间的下标,那么判断num是否等于零。等于零则是回文字符串,否则不是。
- 如果原本对应位置上的字符不相等,改变后相等,则num减二;如果原本对应位置上的字符相等,改变后不相等,则num加二;
- 将传入字符赋给z字符数组s-1下标。判断num是否为0。
- num是判断是否为回文字符串的依据,所以上述的三种情况都要考虑到。
- 要注意数组的奇偶对于中间下标的不同。
C_ Compute’s Matrix
package 训练;
import java.util.Scanner;
public class C {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long t=sc.nextInt();
for(long i=0;i<t;i++) {
long n=sc.nextInt();
long x1=sc.nextInt();
long y1=sc.nextInt();
long x2=sc.nextInt();
long y2=sc.nextInt();
long total=0;
long num=(long) (1E9+7);
long hang=((y2-y1+1)*(y1+y2))/2%num;
long lie=((x2-x1+1)*(x1+x2))/2%num;
total=hang*lie%num;
System.out.println(total);
}
}
}
描述:
- 行和列都是等差数列,运用公式求解比for循环更好,降低了时间复杂度,避免运行时间过长。
- 等差数列:an=a1+(n-1)d
- 等差求和数列:Sn=n*a1+n(n-1)d/2或Sn=n(a1+an)/2
- 等比数列:an=an=a1×q^(n-1)
- 等比数列求和:Sn=a1(1-q^n)/(1-q)
F_ Ssyze’s Hard Drive
package 训练;
import java.util.Arrays;
import java.util.Scanner;
public class F {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int s=sc.nextInt();
int []a=new int[n];
int total=0;
for(int i=0;i<n;i++) {
a[i]=sc.nextInt();
}
Arrays.sort(a);
if(Math.abs(s-a[n-1])>Math.abs(s-a[0])) {
total=Math.abs(s-a[0])+a[n-1]-a[0];
}else {
total=Math.abs(s-a[n-1])+a[n-1]-a[0];
}
System.out.println(total);
}
}
描述:
- 先进行排序,看初始值离最大值还是最小值近,离谁近就先去经过谁,然后算出最小值与最大值时间的距离即可。
- Arrays.sort(数组)--------java中的一种快排方式