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;
else
m=(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结束。
代码 50ms 击败64.34%
class Solution {
public:
int vis[100005]={0};
int a[27]={0};
int maxn=0;
int minDeletions(string s) {
for (int i=0;i<s.size();i++){
a[s[i]-'a']++;
}
for (int i=0;i<26;i++){
if (vis[a[i]])maxn=max(maxn,a[i]);
vis[a[i]]++;
}
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;
}
};
其他解法
把所有的频次都从大到小铺开来,例如"ceabaacb"是3221,当pre=3,now=a[i]=2,符合,不做修改;当pre=2,now=a[i]=2,不符合,修改a[i]=a[i]-1=1,dis++;当pre=1,now=a[i]=1,不符合,修改为0,dis++
代码 46ms 击败83.22%
class Solution {
public:
int a[27] = {0};
int maxn = 0;
int minDeletions(string s) {
for (int i = 0; i < s.size(); i++) {
a[s[i] - 'a']++;
}
sort(a, a + 26,greater<int>());
int dis=0,pre=a[0];
for (int i=1;i<26&&a[i]>0;i++){
cout<<pre<<" "<<a[i]<<endl;
if(pre<=a[i]){
int temp=max(0,pre-1);
dis+=a[i]-temp;
a[i]=temp;
}
pre=a[i];
}
return dis;
}
};