leetcode 3228 将1移动到末尾的最大操作次数
一、题目描述


二、解题思路
整体思路
可以采用找规律+贪心算法来解决这个问题。从左向右处理,遇到'1'右边的'0'时,就更新step的值为step+=count_one;
具体思路
由于一次操作可以让当前位置的'1'移动字符末端或者另一个'1',所以要使得操作次数最多,我们就要保证操作尽可能多地被打断,即我们应该从最左边的'1'开始依次向右操作;
遍历字符串s:
<1>如果i位置为0且i+1位置为1,则i前面的1需要移动过来,其移动次数为i之前'1'的数量:
if(s[i]=='0'&&s[i+1]=='1') step+=count_one;
<2>如果i位置为字符串末尾,且s[i]=='0',就需要将i之前的所以1全部移动:
//如果s的最后一位是0,那么需要将前面所有的1后移
if(i==s.size()-1&&s[i]=='0') step+=count_one;
<3>如果s[i]=='1',就更新count_one的值,count_one++;
三、代码实现
class Solution {
public:int maxOperations(string s) {int count_one=0;int step=0;for(int i=0;i!=s.size();i++){if(s[i]=='0'&&s[i+1]=='1') step+=count_one;//如果s的最后一位是0,那么需要将前面所有的1后移if(i==s.size()-1&&s[i]=='0') step+=count_one;if(s[i]=='1') count_one++;}return step;}
};
