一.题目 :对于一个给定的井字棋棋盘,请设计一个高效算法判断当前玩家是否获胜。
给定一个二维数组board,代表当前棋盘,其中元素为1的代表是当前玩家的棋子,为0表示没有棋子,为-1代表是对方玩家的棋子。
测试样例:[[1,0,1],[1,-1,-1],[1,-1,0]]
返回:true
思路:对于井字棋的获胜方式,有下面几种:
1.一行全为1
2.一列全为1
3.斜角全为1
有获胜的方法就很好写代码了。
代码:
bool checkWon(vector<vector<int> > board)
{
for(int i=0;i<2;i++)
{
if(board[0][i]+board[1][i]+board[2][i]==3)
return true;
}
for(int i=0;i<2;i++)
{
if(board[i][0]+board[i][1]+board[i][2]==3)
return true;
}
if(board[0][0]+board[1][1]+board[2][2]==3)
return true;
if(board[0][2]+board[1][1]+board[2][0]==3)
return true;
return false;
}
二.空格替换
将一个字符串中的空格替换成%20,假设字符串的空间足够大
测试样例:we are happy
输出:we%20are%20happy
解题思路:如果从前往后遍历字符串,遇到空格,就需要把%20插入进去,而%20是三个字符,插进去就要后面的字符全部移动,而如果空格一多,移动的频率就会更多,这样显然不是最好的办法。
观察后发现一个空格替换会让原来的字符串的长度加2,那么如果定义原字符串的长度为n,那么替换之后的字符串为n+2*空格数。那么就我们定义两个指针,一个指向原字符串末尾,一个指向替换字符串末尾,然后让指向原字符串末尾的指针向前移动,如果不是空格,就把此时的值赋给替换后的字符串。如果是空格,就让替换字符串的指针向前移动三次,分别赋予%20,直到结束。这样做的好处是每一个字符都只会被移动一次,效率大大提高。
代码:
string replaceSpace(string s)
{
if (s.size() == 0)
return s;
int count = 0;
for (auto e : s)
{
if (e == ' ')
count++;
}
int oldpoint = 0;
int newpoint = 0;
while (s[oldpoint] != '\0')
oldpoint++;
newpoint = oldpoint + 2 * count;
while (newpoint>oldpoint&&oldpoint>=0)
{
if (s[oldpoint] == ' ')
{
oldpoint--;
s[newpoint--] = '0';
s[newpoint--] = '2';
s[newpoint--] = '%';
}
else
{
s[newpoint--] = s[oldpoint--];
}
}
return s;
}