题意:
一个圆环由字母表组成首尾相接的环,环上有一个指针,最初指向字母a。每次可以顺时针或者逆时针旋转一格。例如,a顺时针旋转到z,逆时针旋转到b。求一个字符串至少要转多少次。
样例输入:
zeus
样例输出:
18
思路:
求解对于一个字母x到另一个字母y是正转还是反转所需转的次数少是本问题的核心。正转和反转的算法与x和y的大小有关,正转的时候直接大的减小的,反转的时候算二者和‘a’的距离之和,然后进行比较。
代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
cin >> str;
int len = str.length();
char ch = 'a';
int sum = 0;
for (int i = 0; i < len; i++)
{
int num1 = 0;
int num2 = 0;
if (str.at(i) > ch)
{
num1 = str.at(i) - ch;//正转
num2 = ch - 'a' + 'z' + 1 - str.at(i);//反转
}
else if (str.at(i) < ch)
{
num1 = 'z' + 1 - ch + str.at(i) - 'a';//正转
num2 = ch - str.at(i);//反转
}
int num = (num1 < num2) ? num1 : num2;
sum += num;
ch = str.at(i);
}
cout << sum;
return 0;
}