【LeetCode-299】Bulls and Cows

问题描述:

  Bulls and Cows这个问题从本质上来讲就是给你两个字符串,让你求出这两个字符串中字符相同且位置相同的字符个数以及字符相同且位置不同的字符个数。记两个字符串分别为secret和guess

1.求两个字符串中字符相同且位置相同的字符个数。

  这个问题比较简单,因为求的是字符相同且位置相同的字符串个数,所以只需要一个for循环对secret和guess字符串进行遍历,看相同位置的字符串是否相同。同时要用无序容器unordered_set(用vector也可以)记下字符相同的那些字符的位置,以免下面第二步重复计算。

2.求出两个字符串中位置不同但字符相同的字符串个数。

  这个问题稍微有点复杂,需要用到无序容器unordered_map。因为计算的时候不能重复计算,即假设两个字符串分别为“1122”和“0111”,则输出的结果要求是1A1B。所以要用一个无序容器unordered_map来存储secret中每个字符各有多少个,即“1122”中1有两个,2有两个。

实现代码:

<p>class Solution {
public:
 string getHint(string secret,string guess){
  unordered_map<char,int>count;
  unordered_set<int>location;
  for(int i=0;i<secret.length();i++){
   if(count.find(secret[i])==count.end())
    count.insert(pair<char,int>(secret[i],1));
   else
    count[secret[i]]++;
        }//用for循环遍历secret字符串,往count中插入数据,count存储的数据表示secret字符串中每个字符的个数。</p><p>  int cntA=0,cntB=0;
  for(int i=0;i<guess.length();i++){
               if(secret[i]==guess[i]){
       cntA++;
       count[secret[i]]--;
          location.insert(i);
      }
  }//用for循环遍历guess字符串,如果在i位置的字符相同,则cntA++;将count中字符数量减一,避免下面计算重复;用location记下字符相同的位置
  for(int i=0;i<guess.length();i++){
   if(location.find(i)!=location.end())
    continue;//如果在location中找到了i,表示i位置的字符相同,属于第一种情况,所以要跳过去,用continue语句退出单次循环
   if(count.find(guess[i])!=count.end()&&count[guess[i]]>=1){
    cntB++;
    count[guess[i]]--;
   }//如果count中找到了字符guess[i],表示secret中存在字符与guess[i]相等,且位置不同。但是要注意count[guess[i]]必须大于0 ,
    //以免重复计算。如果count[guess[i]]等于0,就代表在其他位置该字符已经计算过了,不能再重复计算了。
  }
  return to_string(cntA)+"A"+to_string(cntB)+"B";</p><p> }
};</p>

  关于把数字转换为字符,我在网上查的资料好像在C++里面都可以直接用to_string函数直接把数字转换为字符,我在leatcode网站上面直接copy上面的代码也是直接AC的,to_string 函数没有报错,但是我在VS2010里面调试代码的时候一直报错"有多个重载函数to_string实例与参数列表匹配"。我试着把to_string("cntA")改成(string)to_string((int)cntA),还是同样的错误。而且我在上面的代码中已经定义了cntA是int型的,不知道为什么还会出现这样的错误。

  于是我在Solution类里面又重新定义了一个to_string函数,如下:

string to_string(int i){
  stringstream os;
  os<<i;
  return os.str();
 }

然后编译才通过。可能是VS2010配置的问题吧,代码应该没问题。
总结:

   由于我不太了解unordered_map和unordered_set的用法,所以一开始一直想避开无序容器,想一种其他的方法来解决这个问题。无奈如果避开这两种用法,问题的可能情况太多,写出的代码太冗杂。所以还是老老实实的学一学无序容器吧。基础不扎实,刷题还是困难重重,可是老觉得老抱着一本书看没效率,当用到的时候再去学习,肯定能学的快记得牢。所以还是坚持刷题吧,加油!

你可能感兴趣的:(C++,地图,无序容器,leatcode)