薯队长写了一篇笔记草稿,请你帮忙输出最后内容。
1.输入字符包括,"(" , “)” 和 "<“和其他字符。
2.其他字符表示笔记内容。
3.()之间表示注释内容,任何字符都无效。 括号保证成对出现。
4.”<“表示退格, 删去前面一个笔记内容字符。括号不受”<"影响 。
简单来说,就是括号中的都去掉,<号前边的去掉;
这道题我的思路局限于遇到(,从这个下标开始找下一个),从而导致不能准确的判断出有一对以上的括号时是做法;
看了评论是将坐标记录下来,遇到)直接找到之前记录的坐标;
import java.util.Scanner;
/**
* 薯队长写了一篇笔记草稿,请你帮忙输出最后内容。
* 1.输入字符包括,"(" , ")" 和 "<"和其他字符。
* 2.其他字符表示笔记内容。
* 3.()之间表示注释内容,任何字符都无效。 括号保证成对出现。
* 4."<"表示退格, 删去前面一个笔记内容字符。括号不受"<"影响 。
*/
public class Main {
public static String removeString(String s){
if(s==null){
return null;
}
StringBuffer sb=new StringBuffer();
int i=0;
while (i<s.length()){
if(s.charAt(i)=='('){
int j=i;
for(;j<s.length();j++){
sb.append(s.charAt(j));
if(s.charAt(j)==')'){
sb.delete(i,j+1);
i=j;
break;
}
}
i=j;
}else if(s.charAt(i)=='<'){
sb.deleteCharAt(sb.length()-1);
}else {
sb.append(s.charAt(i));
}
i++;
}
return sb.toString();
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String s=scanner.nextLine();
System.out.println(removeString(s));
}
}
这里需要注意,delect方法是左闭右开区间;
记住维护i;
薯队长最近在玩一个迷宫探索类游戏,迷宫是一个N*N的矩阵形状,其中会有一些障碍物禁止通过。这个迷宫还有一个特殊的设计,它的左右 边界以及上下边界是连通的,比如在(2,n)的位置继续往右走一格可以到(2,1), 在(1,2)的位置继续往上走一格可以到(n,2)。请问薯队长从起点位置S,最少走多少格才能到达迷宫的出口位置E。
链接:https://www.nowcoder.com/questionTerminal/c356fb7d1678419a9e9aa3c6f5a05765?answerType=1&f=discussion
来源:牛客网
输入描述:
第一行正整数N,接下来N行字符串
’.’表示可以通过
’#’表示障碍物
’S’表示起点(有且仅有一个)
’E’表示出口(有且仅有一个)
对于50%的数据N<10
对于100%的数据N<10^3
输出描述:
输出一个整数。表示从S到E最短路径的长度, 无法到达则输出 -1
示例1
输入
5
.#…
…#S.
.E###
…
…
输出
4
我很讨厌做迷宫相关的题,都是DFS BFS,我明天要恶补一下;
这个看了评论思路也不是很清晰;
在游戏中,击败魔物后,薯队长获得了N件宝物,接下来得把这些宝物卖给宝物回收员来赚点小钱。这个回收员有个坏毛病,每次卖给他一件宝 物后,之后他就看不上比这件宝物差的宝物了。在这个世界中,衡量宝物的好坏有两个维度,稀有度X和实用度H,回收员在回收一个宝物A 后,下一个宝物的稀有度和实用度都不能低于宝物A。那么薯队长如何制定售卖顺序,才能卖给回收员宝物总个数最多。
链接:https://www.nowcoder.com/questionTerminal/2f8a06421eea4dfe837453c8be6cb210?answerType=1&f=discussion
来源:牛客网
输入描述:
第一行一个正整数N。 接下来N行。每行两个整数分别表示X 和 H X1 H1 X2 H2 … XN HN
输入限制: 对于70%的数据:
0<N<10^4
0<Xi<10^6
0<Hi<10^6
100%的数据:
0<N<10^6
0<Xi<10^6
0<Hi<10^6
输出描述:
一个整数,表示最多可以卖出的宝物数
示例1
输入
4
3 2
1 1
1 3
1 2
输出
3
这道题看着题目长,其实比前边的简单,有种做数学的感觉,好好读题理解题意;
二维数组;按照第一列进行排序,如果第一列相同按照第二列排序;然后找出第二列的最长升序子序列;
这个找最长升序子序列的题在力扣中有,有两种解法:一种是动态规划,比较容易理解,dp数组中记录子序列的个数,然后如果下一个比它大,则更新,比它小则不变
https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/dong-tai-gui-hua-she-ji-fang-fa-zhi-pai-you-xi-jia/
public static int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
// base case:dp 数组全都初始化为 1
Arrays.fill(dp, 1);
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j])
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
int res = 0;
for (int i = 0; i < dp.length; i++) {
res = Math.max(res, dp[i]);
}
return res;
}
一种是二分查找算法;理解的不透彻;
public class numShow {
public static int numShow(int n,int [][]show){
Arrays.sort(show, (a,b)->a[0]!=b[0]?a[0]-b[0]:a[1]-b[1]);
int []arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=show[i][1];
}
int []dp=new int[n];
int res=0;
for(int num:arr){
int l=0,r=res;
while (l<r){
int mid=(l+r)/2;
if(dp[mid]<num){
l=mid+1;
}else {
r=mid;
}
}
if(l==res){
res++;
}
dp[l]=num;
}
return res;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int [][]arr=new int[n][2];
for(int i=0;i<n;i++){
for(int j=0;j<2;j++){
arr[i][j]=scanner.nextInt();
}
}
// int [][]arr={{3,2},{1,1},{1,3},{1,2}};
System.out.println(numShow(n,arr));
}
}