C++编码实现编程例题:字符串S和T,每次将S中的一个任意字符移到末尾,要多少次才能把S变为T

题外话吐槽一下

今天参加了某个互联网大厂的笔试,虽然就两道编程题,但是结果惨不忍睹 QAQ~wuuuuuu
最大的认识就是,不管算法基础有多好,没有扎实的编程基础来支持就是空谈。
虽然大一的时候学了C++,当时的课设也是自己一行一行码出来的,但是时间一长不用,很多细节就没那么清楚了。所以今天以love and peace的状态做题,想清楚实现的算法后,开始打代码的却发现这也报错那也报错,大部分是语法细节,奔溃啊!!
 


题目描述

好了好了,我们来看看题目吧,当时hin崩溃没有想到拍下来,我努力复述一下,要求大概是这样的:

有个叫小强(or小明or小绿)的家伙会一种“魔法”,可以把一个字符串中任意位置的字符变到这个字符串末尾,比如用一次“魔法”就可以把 clroev 中的 r 移到结尾变成 clovre ,再用一次“魔法”就可以把 clovre 中的 e 移到结尾变成 clover。现在,有两个字符串S和T,要求用这种“魔法”把S变成T。如果S无法变成T,输出“-1”。如果S可以变成T,输出要用“魔法”的次数。
 

代码实现

//  edited by clover ~ ^_^ ~

#include<iostream>
using namespace std;

int main()
{
	string S, T;
	while (1) {
		cin >> S >> T;
		if (S.length() == T.length())
		{
			int num = S.length(), times = 0;
			for (int lastchar = num - 1; lastchar >= 0; --lastchar)
			{
				for (int i = 0; i <= lastchar + 1; ++i)
				{
					//cout << "i=" << i << ",lastchar=" << lastchar << endl;
					if (i == lastchar + 1)
					{
						cout << "-1";
						return 0;
					}
					//cout << "S[i]=" << S[i] << ",T[lastchar]=" << T[lastchar]<<endl;
					if (S[i] == T[lastchar])
					{
						if (i == lastchar)
						{
							//cout << "同位置不用变";
							break;
						}
						char temp = S[i];
						for (int j = i; j < lastchar; ++j)
						{
							S[j] = S[j + 1];
						}
						S[lastchar] = temp;
						++times;
						//cout << "第" << times << "次改变后:" << S << endl;
						break;
					}
					//else cout << "第" << i << "次尝试失败" << endl;
				}
			}

			cout << times<<endl;
		}
		else
		{
			//cout << "length does not match!" << endl;
			cout << "-1"<<endl;
		}
	}
	
}

测试和分析

在这里插入图片描述

  • 输入字符串长度不一致时,直接返回-1
aaaa
aaa
-1
  • 输入的S和T一样时,不用使用“魔法”
aaaa
aaaa
0
  • 其它比较普通的例子
haaaaaaaa
aaaaaaaah
1
clover
clorev
2
  • 算法没考虑到的例子(还是有bug的大家见谅,也欢迎大佬们提出优化算法)
    像以下这样的情况,其实只要把第一位移到最后,用一次魔法就行,但是由于算法是从后面开始移动,就会错误。
hahahahaha
ahahahahah
5
发布了26 篇原创文章 · 获赞 32 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Clover_pofu/article/details/105141101