题目
小扣在秋日市集发现了一款速算机器人。店家对机器人说出两个数字(记作 x 和 y),请小扣说出计算指令:
“A” 运算:使 x = 2 * x + y;
“B” 运算:使 y = 2 * y + x。
在本次游戏中,店家说出的数字为 x = 1 和 y = 0,小扣说出的计算指令记作仅由大写字母 A、B 组成的字符串 s,字符串中字符的顺序表示计算顺序,请返回最终 x 与 y 的和为多少。
题目传送门
思路
我看到这题,就想着,乘以2,可以用位运算来做,这是考察的点。
虽然也A了。
代码
class Solution {
public int calculate(String s) {
int x=1;
int y=0;
int length=s.length();
for(int i=0;i<length;++i)
{
if(s.charAt(i)=='A')
{
x<<=1;
x+=y;
}
else
{
y<<=1;
y+=x;
}
}
return x+y;
}
}
结果
题解思路
结果看了评论区,有个老哥是真的秀。因为最终要计算x+y的和。
当字符为A时,结果为 2x+y+y;
当字符为B时,结果为2y+x+x。
所以无论如何,结果都是2(x+y)。
我直接好家伙,直接返回2(x+y)^s.length()即可!
class Solution {
public int calculate(String s)
{
if(s.length()==0)
return 1;
return (int)(Math.pow(2,s.length()));
}
}
题解结果
有这种如此敏锐的数学思维,真的是太强了。
思路2
既然是求2的n次方,那还不如直接位运算呢!
代码
class Solution {
public int calculate(String s)
{
if(s.length()==0)
return 1;
int length = s.length();
int ans=1;
for(int i=0;i<length;++i)
{
ans<<=1;
}
return ans;
}
}