1041. 困于环中的机器人
简单做法
(python写多了c++都不会写了qwq)时间复杂度为4n
class Solution {
public:bool isRobotBounded(string is) {int x=0,y=0,m=0;int dx[]={0,-1,0,1};int dy[]={1,0,-1,0};is=is+is+is+is;for (int i=0;i<is.size();i++)if (is[i]=='G'){x=x+dx[m];y=y+dy[m];}else if (is[i]=='L')m=(m+1)%4;elsem=(m+3)%4;return (x==0&&y==0);}
};
思考
其实可以不用四倍的,之间判断m是否为0就可以判断是否会绕圈了。
class Solution {
public:bool isRobotBounded(string is) {int x=0,y=0,m=0;int dx[]={0,-1,0,1};int dy[]={1,0,-1,0};for (int i=0;i<is.size();i++)if (is[i]=='G'){x=x+dx[m];y=y+dy[m];}else if (is[i]=='L') m=(m+1)%4;else m=(m+3)%4;return (x==0&&y==0)|m;}
};
1647. 字符频次唯一的最小删除次数
思路
用vis数组统计出每个频次出现的次数。例如vis数组为012,那么就是不为1的地方要挪到为0的地方,如果有0的地方不满足后面不为1的地方,就把自己全删掉。
在实际写代码的时候,从后往前推,如果有大于1的wr+1,如果有0的,wr-1。一直到1结束。
代码
class Solution {
public:int vis[100005]={0};map<char,int>p;int maxn=0;int minDeletions(string s) {for (int i=0;i<s.size();i++){p[s[i]]++;}for (auto q:p){if (vis[q.second])maxn=max(maxn,q.second);vis[q.second]++;}int wr=0;int dis=0;for (int i=maxn;i>0;i--){if(vis[i]>1)wr+=(vis[i]-1);else if(vis[i]==0)wr=max(0,wr-1);dis=dis+wr;}return dis;}
};
更好的解法
把所有的频次都铺开来,例如112233