考試的時候想復雜了,其實直接一邊寫放進set里去重就可以了
很有意思
自己的理解就是cpp的map+set或者就是set可以完成大多數java的hashset操作
鏈接:https://ac.nowcoder.com/acm/problem/221493
來源:牛客網
題目描述
小紅有一個字符串,她每次操作可以改變一個字符的值。
對於'a'、'b'、'c'、……、'y'等小寫字母,小紅每次操作可以把該字母變成比它大一位的字母,即變成'b'、'c'、'd'、……、'z'。
對於'A'、'B'、'C'、……、'Y'等大寫字母,小紅每次操作可以把該字母變成比它大一位的字母,即變成'B'、'C'、'D'、……、'Z'。
對於'0'、'1'、'2'、……、'8'等數字,小紅每次操作可以把該數字變成比它大一位的數字,即變成'1'、'2'、'3'、……、'9'。
對於一些特殊的字符:
- 'z' 會變成 'A'。
- 'Z' 會變成 '0'。
- '9' 會變成 'a'。
現在小紅想使這個字符串不存在任意相同的兩個字符,你能輸出這個最小的操作次數嗎?
輸入描述:
第一行一個正整數nn,代表字符串的長度。
接下來一個長度為nn的,僅包含小寫字母、大寫字母或數字的字符串。
輸出描述:
如果小紅無法達成目的,則輸出 -1 ,否則輸出最小的操作次數。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
string str;
scanf("%d", &n);
cin >> str;
int cnt = 0;
if (n > 62)
{
cout << -1 << endl;
return 0;
}
set<char> st;
for (int i = 0; i < n; i++)
{
char ch = str[i];
while (st.count(ch) == 1)
{
cnt++;
if ( ch == 'z' )
{
ch = 'A'; continue;
}
else if ( ch == 'Z')
{
ch = '0'; continue;
}
else if ( ch == '9' )
{
ch = 'a'; continue;
}
ch++;
}
st.insert(ch);
}
// auto it = st.begin();
// while(it != st.end())
// {
// cout << *it << endl;
// it++;
// }
cout << cnt << endl;
system("pause");
}