一行输入一个长度不超过
的小写字母字符串
。
在一行上输出一个整数,代表把
变成回文串的最少操作次数。
abcd
4
一种可行方案:(共
次操作)。
nuhhhh
19
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
int len = s.length();
int sum = 0;
for (int i = 0; i < len / 2; i++) {
char a = s.charAt(i);
char b = s.charAt(len - 1 - i);
// 计算两个字符的最小距离(循环右移次数)
int diff = Math.abs(a - b);
sum += Math.min(diff, 26 - diff);
}
System.out.println(sum);
}
}
#include <iostream>
using namespace std;
int main() {
// 将字符串从中间分开
string str;
while (cin >> str) {
int subStrSize = str.size() / 2;
string leftSubStr = str.substr(0,subStrSize);
string rightSubStr = str.substr(subStrSize,subStrSize);
int cnt = 0;
for (int i = 0; i < subStrSize; i++) {
char tmpLeftStr = leftSubStr[i];
char tmpRightStr = rightSubStr[subStrSize-1-i];
if (tmpLeftStr != tmpRightStr) {
// 先让左边字符循环右移,在让右边字符循环右移,比较哪个操作次数少
int leftNum = 0;
while (tmpLeftStr != tmpRightStr) {
if (tmpLeftStr == 'z') {
tmpLeftStr = 'a';
} else {
tmpLeftStr += 1;
}
leftNum++;
}
//
tmpLeftStr = leftSubStr[i];
tmpRightStr = rightSubStr[subStrSize-1-i];
int rightNum = 0;
while (tmpLeftStr != tmpRightStr) {
if (tmpRightStr == 'z') {
tmpRightStr = 'a';
} else {
tmpRightStr += 1;
}
rightNum++;
}
cnt += leftNum < rightNum ? leftNum : rightNum;
}
}
cout << cnt << endl;
}
} #include <iostream>
#include <string>
int func(char a,char b)
{
int res = std::min((b-a+26)%26,(a-b+26)%26);
return res;
}
int main()
{
std::string s;
std::cin>>s;
int n = s.size();
int ans = 0;
for(int l = 0,r = n-1;l<r;l+=1,r-=1)
{
ans += std::min(func(s[l],s[r]),func(s[r],s[l]));
}
std::cout<<ans<<'\n';
} #include <any>
#include <iostream>
using namespace std;
int main() {
string s;
cin >> s;
int sum = 0;
for(int i = 0, j = s.length() - 1; i < j; i++, j--){
if(s[i] > s[j]) swap(s[i], s[j]);
if(s[j] - s[i] <= 13) sum += (s[j] - s[i]);
else sum += (26 - (s[j] - s[i]));
}
cout << sum << endl;
return 0;
}
// 64 位输出请用 printf("%lld")
/*
a -- b 1步
b -- a 26步
s[cur] - s[tar] <= 13; 步骤增加 s[tar] - s[cur]
s[cur] - s[tar] > 13; 步骤增加 26 - (star - s[cur]);
a b c d e f g h i j k l m
n o p q r s t u v w x y z
*/ import java.util.*;
import java.io.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) throws IOException {
String str = br.readLine();
int strlen = str.length();
int sum = 0;
// a ok 0
// ab 0,1 1
// abc 0,2/1,1 2
// abcd 0,3/1,2/2,2 4
for (int i = 0; i < strlen / 2; i++) {
sum += cal(str.charAt(i), str.charAt(strlen - i - 1));
}
System.out.println(sum);
}
public static int cal (char a, char b) {
// a z 25 1
int len = Math.abs(a - b);
int minlen = Math.min(len, 26 - len);
if (minlen == 0) return 0;
return minlen;
}
static BufferedReader br = new BufferedReader(new InputStreamReader(
System.in)); //br.readLine() 读字符串
static StreamTokenizer st = new StreamTokenizer(br);
static int ad() throws IOException {
st.nextToken();
return (int) st.nval;
}
} import java.util.*;
import java.io.*;
//下标为i和下标为n-1-i的字符是一组c1和c2。
//c1操作和c2操作一个右移到另一个是最短的,
//两个都移动为第三个字符的情况一定会比单个移动到另一个的移动次数多,因为可假设第三字符在两个字符之间或两字符之外循环单向移动都会更长
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
char[] input=bf.readLine().toCharArray();
int min=0;
for(int a=0,b=input.length-1;a<b;a++,b--){
int c1c2=(input[a]-input[b]+26)%26;//c1右移到c2 取模为正取正,为负取正向移动的另一半距离。
int c2c1=(input[b]-input[a]+26)%26;//c2右移到c1
min+=Math.min(c2c1,c1c2);
}
System.out.println(min);
}
} #include <bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
#define endl '\n'
#define N 100005
string s;
int ans=0;
int check(char st,char end){
return ((int)end-(int)st+26)%26;
}
signed main() {
cin>>s;
for(int i=0;i<s.size()/2;i++){
ans+=min(check(s[i],s[s.size()-1-i]),check(s[s.size()-1-i],s[i]));
}
cout<<ans<<endl;
return 0;
}
// 64 位输出请用 printf("%lld")