对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());