牛客网刷题笔记
1.单词消消乐
牛妹会给牛牛n个单词,牛妹要求牛牛将这n个单词按照以下方式合并:
1.从左往右合并单词,将合并后的单词作为第一个单词再与后面单词合并
例如有三个单词"a",“b”,“c”,先将"ab"合并,最后将合并后的"ab"与"c"合并得到"abc"。
2.如果最左边单词结尾字母与其后面一个的单词的开始字母相同,则最左边单词的结尾字母与之后一个单词的开始字母都会抵消掉而消失,重复上述操作直到某一个单词为空或者最左端的结尾字母与之后单词的开始字母不同,然后合并这两个单词作为一个单词放置再最左边。
例如 “aab” “bac"合并之后会得到"ac”
返回最终合并后的单词。
若为空则返回一个空串。
示例1
输入:
[“aab”,“bac”,“ccd”]
返回值:
“acd”
说明:
“aab"与"bac"合并得到"ac”
“ac"再与"ccd"合并得到"acd”
备注:
解法:自己的想法
1.字符串1的尾和字符串2的和头比较,相同即合并;
2.数组存放字符串;
3.合并后的字符串合1与第三个字符串重复以上操作。
题目参考解法:
利用Stack的先进先出特性,将字符串转换为的字符挨个装入时,与最顶端的字符比较,若相同,弹出字符,该字符不装入,否则,装入字符。最后转为字符串,返回。
代码:
`import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param Words string字符串一维数组
* @return string字符串
*/
public String WordsMerge (String[] Words) {
// write code here
if(Words == null){
return “”;
}
Stackstack = new Stack<>();
for(int i=0;i<Words.length;i++){
int size = Words[i].length();
for(int j = 0;j<size;j++){
if(stack.isEmpty())
stack.push(Words[i].charAt(j));
else{
char x=stack.peek();
if(x!=Words[i].charAt(j)){
stack.push(Words[i].charAt(j));
}else{
stack.pop();
}
}
}
}
String str = "";
while(!stack.isEmpty()){
str = stack.pop()+""+str;
}
return str;
}
}`
2.枪打出头鸟
描述
现在有n个人站成一列,第i个人的身高为a_{i-1}a i−1。
他们人手一把玩具枪,并且他们喜欢把枪举在头顶上。
每一次练习射击,他们都会朝正前方发射一发水弹。
这个时候,第i个人射击的水弹,就会击中在他前面第一个比他高的人。
牛牛认为这样的练习十分的荒唐,完全就是对长得高的人的伤害。
于是它定义了一个荒唐度,初始为0。
对于第i个人,如中他击中了第j个人,则荒唐度加j,如果没有击中任何人,则荒唐度加0.
牛牛想问你,你能计算出荒唐度是多少吗?
示例1
输入:
5,[1,2,3,4,5]
返回值:
0
说明:
没有一个人击中任何一个人
示例2
输入:
5,[5,4,3,2,1]
返回值:
10
说明:
第二个人击中第一个人,第三个人击中第二个人,第四个人击中第三个人,第五个人击中第四个人; 1+2+3+4=10
备注: