编程练习————part2

一.题目 :对于一个给定的井字棋棋盘,请设计一个高效算法判断当前玩家是否获胜。

给定一个二维数组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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值