考试的时候想复杂了,其实直接一边写放进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\’。
对于一些特殊的字符:

  1. \’z\’ 会变成 \’A\’。
  2. \’Z\’ 会变成 \’0\’。
  3. \’9\’ 会变成 \’a\’。
    现在小红想使这个字符串不存在任意相同的两个字符,你能输出这个最小的操作次数吗?

输入描述:
第一行一个正整数nn,代表字符串的长度。
接下来一个长度为nn的,仅包含小写字母、大写字母或数字的字符串。

输出描述:
如果小红无法达成目的,则输出 -1 ,否则输出最小的操作次数。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. int n;
  6. string str;
  7. scanf("%d", &n);
  8. cin >> str;
  9. int cnt = 0;
  10. if (n > 62)
  11. {
  12. cout << -1 << endl;
  13. return 0;
  14. }
  15. set<char> st;
  16. for (int i = 0; i < n; i++)
  17. {
  18. char ch = str[i];
  19. while (st.count(ch) == 1)
  20. {
  21. cnt++;
  22. if ( ch == \'z\' )
  23. {
  24. ch = \'A\'; continue;
  25. }
  26. else if ( ch == \'Z\')
  27. {
  28. ch = \'0\'; continue;
  29. }
  30. else if ( ch == \'9\' )
  31. {
  32. ch = \'a\'; continue;
  33. }
  34. ch++;
  35. }
  36. st.insert(ch);
  37. }
  38. // auto it = st.begin();
  39. // while(it != st.end())
  40. // {
  41. // cout << *it << endl;
  42. // it++;
  43. // }
  44. cout << cnt << endl;
  45. system("pause");
  46. }

版权声明:本文为kinologic原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/kinologic/p/14756054.html