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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章