对01字符串进行一些操作,01字符串上的0和0相邻时会变成1,而1和1相邻时会在字符串上消失,而0和1相邻时什么都不会发生,问这个字符串最后会变成什么样。
"00110001"
"01"
00110001→1110001→10001→1101→01
,字符串上的合并消失应优先与左边进行,例如000,中间的0优先与左边的0合并变为10,消失同理
/** * * @param str string字符串 初始字符串 * @return string字符串 */ function solve( str ) { // write code here let s=[]; s.push(str[0]); let a=str[0]; for(let i=1;i<str.length;i++){ if(s.length==0){ s.push(str[i]); a=str[i]; }else if(a==1&&str[i]==1){ s.pop(); while(s[s.length-1]==1&&s[s.length-2]==1){ s.pop(); s.pop(); } if(s.length!=0) a=s[s.length-1]; }else if(a==0&&str[i]==0){ s.pop(); s.push(1); while(s[s.length-1]==1&&s[s.length-2]==1){ s.pop(); s.pop(); } if(s.length!=0) a=s[s.length-1]; }else{ s.push(str[i]); a=str[i]; } } return s.toString().split(/,/g).join(""); }一个栈,两个指针,要注意在11和00后对之前的项进行再次11的循环处理。
class Solution: def solve(self , str ): # write code here stack = [] for c in str: if not stack: stack.append(c) else: if c == '0': if stack[-1] == '0': stack.pop(-1) tag = 0 while stack and stack[-1] == '1': tag = 1 stack.pop(-1) if not tag: stack.append('1') else: stack.append(c) else: if stack[-1] == '1': stack.pop(-1) else: stack.append(c) return ''.join(stack)
import java.util.*; public class Solution { public String solve (String str) { // write code here Stack<Character> stack=new Stack<>(); stack.push(str.charAt(0)); char a=str.charAt(0); for(int i=1;i<str.length();i++){ char ch=str.charAt(i); if(stack.size()==0){ stack.push(ch); a=ch; }else if(a=='1' && ch=='1'){ stack.pop(); while(stack.size()>1 && stack.get(stack.size()-1)=='1' && stack.get(stack.size()-2)=='1'){ stack.pop(); stack.pop(); } if(stack.size()!=0){ a=stack.peek(); } }else if(a=='0' && ch=='0'){ stack.pop(); stack.push('1'); while(stack.size()>1 &&stack.get(stack.size()-1)=='1' && stack.get(stack.size()-2)=='1'){ stack.pop(); stack.pop(); } if(stack.size()!=0){ a=stack.peek(); } }else{ stack.push(ch); a=ch; } } String ss=""; while(!stack.isEmpty()){ ss=stack.pop()+ss; } return ss; } }
public static String solve(final String str) { // write code here final StringBuilder sb = new StringBuilder(); for (final char c : str.toCharArray()) { sb.append(c); while (sb.length() > 1) { final int n = sb.length(); if( sb.charAt(n-1) == '0' && sb.charAt(n-2) == '0'){ sb.deleteCharAt(sb.length() - 1); sb.deleteCharAt(sb.length() - 1); sb.append('1'); }else if( sb.charAt(n - 2) == '1' && sb.charAt(n - 1) == '1' ){ sb.deleteCharAt(sb.length() - 1); sb.deleteCharAt(sb.length() - 1); }else{ break; } } } return sb.toString(); }贴一下我的代码吧,就维护一个StringBuilder,然后就模拟就可以了
StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(str.charAt(0)); // 遍历源字符串 拿出每一个字符和StringBuffer中的字符进行比较 for(int i= 1;i < str.length();i++){ if (stringBuffer.length()==0){ stringBuffer.append(str.charAt(i)); continue; } if (stringBuffer.charAt(stringBuffer.length() - 1) == str.charAt(i)){ if (str.charAt(i)== '0'){ stringBuffer.setCharAt(stringBuffer.length() -1,'1'); if (stringBuffer.length()>=2 && stringBuffer.charAt(stringBuffer.length()-2) == '1'){ stringBuffer.delete(stringBuffer.length()-2,stringBuffer.length()); } }else{ stringBuffer.deleteCharAt(stringBuffer.length() - 1); } }else{ stringBuffer.append(str.charAt(i)); } } System.out.println(stringBuffer.toString());