首页 > 试题广场 >

笔记草稿

[编程题]笔记草稿
  • 热度指数:6411 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
薯队长写了一篇笔记草稿,请你帮忙输出最后内容。
 1.输入字符包括,"("    ,    ")"        "<"和其他字符。 
2.其他字符表示笔记内容。
 3.()之间表示注释内容,任何字符都无效。    括号保证成对出现。
 4."<"表示退格,    删去前面一个笔记内容字符。括号不受"<"影响    。 

输入描述:
输入一行字符串。长度<=10000.


输出描述:
输出一行字符串,表示最终的笔记内容。 
示例1

输入

Corona(Trump)USA<<<Virus

输出

CoronaVirus
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 *
 * @Auther: jayclin
 * @Date: 2020/06/07/19:57
 * @Description:
 * 链接:https://www.nowcoder.com/questionTerminal/0823ca800ee04706a7e2dafc837dc236
 * 来源:牛客网
 *
 * 薯队长写了一篇笔记草稿,请你帮忙输出最后内容。
 *  1.输入字符包括,"("    ,    ")"    和    "<"和其他字符。
 * 2.其他字符表示笔记内容。
 *  3.()之间表示注释内容,任何字符都无效。    括号保证成对出现。
 *  4."<"表示退格,    删去前面一个笔记内容字符。括号不受"<"影响    。
 */
public class Solution {
    public static String output(String str){
        StringBuilder stringBuilder=new StringBuilder();
        int n=str.length();
        int num=0;//记录括号的个数
        for (int i=0;i<n;i++){
            if (str.charAt(i)=='(')num++;
            if(num!=0){
                if (str.charAt(i)==')')
                    num--;
                continue;
            }
            if(str.charAt(i)=='<'){
                stringBuilder.deleteCharAt(stringBuilder.length()-1);
                continue;
            }
            stringBuilder.append(str.charAt(i));
        }
        return stringBuilder.toString();
    }

    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        String str=s.nextLine();
        System.out.println(output(str));
    }
}

发表于 2020-06-07 21:36:02 回复(0)
#include<iostream>
#include<string>
using namespace std;


int main() {
	string str;
	getline(cin, str);
	string res;
	for (int i = 0; i < str.size(); i++) {
		if (str[i] == '(')
		{
			i++;
			int n = 1;
			while (i < str.size() && n != 0)
			{
				if (str[i] == '(')
					n++;
				if (str[i] == ')')
					n--;
				if (n == 0)
					break;
				i++;
			}
		}
		else if (str[i] == '<')
		{
			if (!res.empty())
				res.pop_back();
		}
		else {
			res.push_back(str[i]);
		}
	}
	cout << res << endl;
	return 0;
}

发表于 2020-06-21 16:01:39 回复(1)
function fun(str) {
    let arr = str.split('');
    let res = [];
    let flag = false;
    arr.forEach(val => {
        if (val == '(') {
            flag = true;
            return true;
        }
        if (flag) {
            if (val == ')') {
                flag = false;
            }
            return true;
        }
        if (val == '<') {
            res.pop();
        } else {
            res.push(val);
        }
    });
    return res.join('');
}
console.log(fun('Corona(Trump)USA<<<Virus')); // CoronaVirus
第一个 JavaScript ^_^解答
发表于 2020-06-30 17:08:39 回复(2)
function reset(str) {
    str = str.replace(/(\(\w+\))/g, (match, $1) => '');
    let arr = str.split('')
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] === '<') {
            arr.splice(i,1)
            arr.splice(i-1,1)
            i -= 2
        }
    }
    return arr.join('')
}
console.log(reset('Corona(Trump)USA<<<Virus'))
发表于 2021-02-24 13:14:13 回复(0)
#include <iostream>
#include <vector>
using namespace std; 
/* run this program using the console pauser&nbs***bsp;add your own getch, system("pause")&nbs***bsp;input loop */

int main(int argc, char** argv) {
	string s;
	cin>>s;
	int k=0;
	vector<char> m;
	for(int i=s.length()-1;i>=0;i--){
		if(s[i]=='<'){
			int l=1;
			while(l){
				i--;
				if(s[i]=='<') l++;
				if(s[i]!='<'&&s[i]!=')') {
					l--;	
				}
				if(s[i]==')'){
					k+=l;
					l=0;
					i++;
				}
			}
		}else if(s[i]==')'){
			int h=1;
		    while(h){
		    	i--;
		    	if(s[i]=='('){
		    		h--;
				}
				if(s[i]==')'){
					h++;
				}
			}	
		}else{
			if(k!=0){
				i=i-k;
				k=0;
				i++;
			}else{
				m.push_back(s[i]);
			}
			
		}
	}
	for(int i=m.size()-1;i>=0;i--){
		cout<<m[i];
	}
	return 0;
}

发表于 2021-01-09 21:46:02 回复(0)

就问问你们,谁有我短?

s=input().strip()
a=[]
left=0
for i in s:
    if i=='(':
        left+=1
        continue
    if left:
        if i==')':
            left-=1
        continue
    if i=='<':
        a.pop()
    else:
        a.append(i)
s=''.join(a)
print(s)


发表于 2020-06-22 12:44:25 回复(8)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer = new StringBuffer(scanner.nextLine());
        List<Integer> k = new ArrayList<>();
        //用一个列表来装括号的匹配
        //遇见‘(’添加首次匹配位置进去
        //遇见‘)’从最后一次‘(’匹配位置开始删除字符串
        for(int i = 0; i < stringBuffer.length();){
            if(stringBuffer.charAt(i)=='(') {
                k.add(i);
                i++;
            }
            else if(stringBuffer.charAt(i)=='<'&&k.size()==0) {
                stringBuffer.delete(i - 1, i + 1);
                i = i - 1;
            }
            else if(stringBuffer.charAt(i)==')') {
                stringBuffer.delete(k.get(k.size() - 1),i + 1);
                i = k.get(k.size() - 1);
                k.remove(k.size() - 1);
            }
            else
                i++;
        }
        System.out.println(stringBuffer);
    }
}

发表于 2020-08-05 21:01:30 回复(4)
在下拙见
function fun(str) {
      var stack = [];
      str = str.split("");
      var res = '';
      for (var i = 0; i < str.length; i++) {
        if(str[i] != "(" && str[i] != ")" && stack.length == 0){
          res += str[i]
        }
        if(str[i] == "(" ){
          stack.push(i)
        }
        if(str[i] == ")"){
          stack.pop()
        }
      }
      res = res.split("");
      for(var i = 0 ; i < res.length ; i++){
        if(res[i] == "<"){
          res.splice(i-1,2);
          i--;
          i--;
        }
      };
       return res.toString().replace(/\,/g,"")
    }


发表于 2020-07-07 19:35:01 回复(2)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        
            while(str.contains(")") ) {
                int right = str.indexOf(")");
                int left = str.lastIndexOf("(",right);
                String n = "";
                String rep = str.substring(left+1,right);
                str = str.replace("(" +rep+")",n );
            }
            while(str.contains("<")&& str != null) {
                int index = str.indexOf("<");
                String m = "";
                String rep2 = str.substring(index -1,index);
                     str = str.replace(rep2 + "<",m );
            }
        System.out.println(str);
    }
}

发表于 2020-08-21 23:47:49 回复(0)
import sys
 
def translate(word):
    stack = []
    while word:
        k = word.pop()
        if k == ")":
            while True:
                v = stack.pop()
                if v == "(":
                    break
        elif k == "<":
            stack.pop()
        else:
            stack.append(k)
    res = ""
    while stack:
        res += stack.pop(0)
    return res
 
string = sys.stdin.readline()
liststring = list(string[::-1])
ans = translate(liststring)
sys.stdout.write(ans)

发表于 2020-06-11 23:18:10 回复(0)

正则表达式

需要注意括号中的字符要排除括号本身才能正确地按层次关系匹配。
举个例子,针对1(23(4)5)67,如果使用\\(.*?\\)来匹配首先匹配到的是(23(4)

类似地,为了防止<消除<自身,也需要排除<

package main

import (
    "fmt"
    "regexp"
)

func main() {
    in:=""
    fmt.Scan(&in)
    reg,_:=regexp.Compile("\\([^\\(\\)]*?\\)")
    for reg.MatchString(in){
        in=reg.ReplaceAllString(in,"")
    }
    reg,_=regexp.Compile("[^<]<")
    for reg.MatchString(in){
        in=reg.ReplaceAllString(in,"")
    }
    fmt.Println(in)
}
发表于 2020-06-04 17:55:32 回复(0)
let line = readline();
const filterText = (line) => {
    let a = []
    for (let item of line) {
        if(item === ')'){
            while(a.pop()!=='(');
        }else if(item === '<'){
            a.pop()
        } else {
            a.push(item)
        }
    }
    return a.join('');
}
 
console.log(filterText(line));

发表于 2022-09-18 20:23:25 回复(0)
//思路:从字符串后面开始遍历,遇到'<'表示后续遍历遇到字符就可以直接跳过
//在括号内的字符不添加,因此设置state来表示括号嵌套层数

#include<iostream>
#include<algorithm>
#include <string>
using namespace std;

int main(){
    string s;
    getline(cin,s);
    int n=s.size();
    int state=0;//state=0表示不在括号内,state>0表示在括号内(state=1表示一层嵌套,state=2表示两层嵌套)
    int needDel=0;//遇到'<',就记录后续需要删除的元素+1,后续遇到括号外的字符,就可以直接略过了

    string res;
    for(int i=n-1;i>=0;i--){
        char c=s[i];
        if(state==0){//括号外
            if(c=='<') needDel++;
            else if(c==')') state=1;
            else{
                if(needDel>0) needDel--;
                else res+=c;
            }
        }
        else if(state>0){//括号内
            if(c==')') state++;//嵌套层数+1
            if(c=='(') state--;//嵌套层数-1
        }
    }
    for(int i=res.size()-1;i>=0;i--){
        cout<<res[i];
    }
    
    system("pause");
    return 0;
}

发表于 2022-08-27 23:51:31 回复(0)
function logNote(str){
  // 用栈做存储 遇到(的时候不处理 遇到 )后继续push进去 遇到< 直接pop出去
  let stack = [];
  let arr = str.split('');
  //阀门
  let valve = true;
  arr.forEach((item) => {
    if(item == '('){
      valve = false;
    }else if(item == ')'){
      valve = true;
      return;
    }
    if(valve){
      stack.push(item);
    }
    if(item == '<'){
      stack.pop();
    }
  });
  return stack.join();
}


发表于 2022-05-13 00:27:26 回复(0)
#include <iostream>
#include <string>
using namespace std;
 
int main(int argc, char* argv[]){
    string str;
    char c;
    int bracket = 0;
    while((c = getchar()) != '\n'){
        switch(c){
            case '(':
                bracket++;
                break;
            case ')':
                bracket--;
                break;
            case '<':
                if(!bracket) str.pop_back();
                break;
            default:
                if(!bracket) str += c;
                break;
        }
    }
    cout << str << endl;
    return 0;
}

发表于 2020-07-01 12:32:31 回复(0)
strs = list(input())
result = []
for str in strs:
    if str == ')':
        while True:
            a = result.pop()
            if a == '(':
                break
    elif str == '<':
        result.pop()
    else:
        result.append(str)
print("".join(result))
发表于 2020-06-11 10:44:16 回复(1)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
    char str[10001];
    fgets(str, 10001, stdin);
    int len = strlen(str);
    if (str[len - 1] == '\n') {
        str[len - 1] = '\0';
        len--;
    }

    char* newstr = malloc(len * sizeof(char));
    int k = 0;
    int j = 0;
    for (int i = 0; i < len; i++) {
        if (str[i] == '(') {
            k++;
        } else if (str[i] == ')') {
            k--;
        } else if (k == 0) {
            if (str[i] == '<') {
                newstr[j] = '\0';
                j -= 1;
            } else {
                newstr[j] = str[i];
                j++;
            }
        }
    }

    for (int i = 0; i < j; i++) {
        if (newstr[i] != '\0') {
            printf("%c", newstr[i]);
        }
    }
    return 0;
}

发表于 2024-10-12 02:41:41 回复(0)
模拟,需要用栈来记录嵌套的括号
import sys

l=input()
stack=[]
while True:
    changed=False
    new_s=""
    i=0
    n=len(l)
    has2=False
    while i<n:
        
        if l[i]=="(":
            stack.append("(")
            for j in range(i+1,n):
                i+=1
                if l[j]=="(":
                    stack.append("(")
                if l[j]==")":
                    stack.pop()
                if not stack:
                    i+=1
                    break
                
            changed=True
        
        elif i<n and l[i]=="<" :
            i+=1
            new_s=new_s[:-1]
            has2=True
            changed=True
        else:
            new_s+=l[i]
            # print(l[i])
            i+=1
        
    if not changed:
        break
    l=new_s
print(l)


            



发表于 2024-08-06 12:02:43 回复(0)
def note_algorithm(str):

    new_str=""
    index = 0
    left_count = 0
    right_count = 0
    flag = False

    for index in range(len(str)):
        if str[index] != "(" and str[index] != ")" and str[index] != "<" and (not flag):
            new_str += str[index]
        elif str[index] == "(":
            left_count += 1
            flag = True
        elif str[index] == ")":
            right_count += 1
            if left_count == right_count:
                flag = False
            index += 1
        elif str[index] == "<":
            new_str = new_str[:-1]
        elif flag:
            index += 1
    return new_str
编辑于 2024-03-29 01:57:03 回复(0)
#include <iostream>
#include <string>
#include <stack>
using namespace std;

int main() {
    string a="",b="";
    while (cin >> a) { // 注意 while 处理多个 case
        stack<char> s;
        int cnt=0;
        for(auto c:a){
            if(c=='(') cnt++;
            else if(cnt!=0&&c==')') cnt--;
            else{
                if(cnt==0){
                    if(c=='<'&&!s.empty()) s.pop();
                    else s.push(c);
                }
            }
        }
        while(!s.empty()){
            b = s.top()+b;
            s.pop();
        }
        cout << b << endl;
    }
}
// 64 位输出请用 printf("%lld")
发表于 2023-07-14 17:03:07 回复(0)