#1024程序员节 | 征文#
作为一个未来的程序员,现在我要继续刷题了。
力扣时刻。
目录
1.接雨水
2.罗马数字转整数
3.最后一个单词的长度
4.最长公共前缀
5.反转字符串中的单词
1.接雨水
好好好好好好,一开始就接雨水。我记得接了n次了。。。
痛苦战绩
本题的思路:
对于每个节点,计算0-i的最大值,计算i-n-1的最大值,然后利用(左边最大值,右边最大值)的最小值-高度就是面积了,因为宽度为1.
class Solution {
public int trap(int[] height) {
//左右数组
int n=height.length;
int [] left=new int[n];
left[0]=height[0];
for(int i=1;i<n;i++){
left[i]=Math.max(left[i-1],height[i]);
}
int [] right=new int[n];
right[n-1]=height[n-1];
for(int i=n-2;i>=0;i--){
right[i]=Math.max(right[i+1],height[i]);
}
int ret=0;
for(int i=0;i<n;i++){
ret+=(Math.min(left[i],right[i])-height[i]);
}
return ret;
}
}
2.罗马数字转整数
把一个小值放在大值的左边,就是做减法,否则为加法。
class Solution {
public int romanToInt(String s) {
int sum=0;
int preNum=getValue(s.charAt(0));
for(int i=1;i<s.length();i++){
int num=getValue(s.charAt(i));
if(preNum<num){
sum-=preNum;
}else{
sum+=preNum;
}
preNum=num;
}
sum+=preNum;
return sum;
}
private int getValue(char ch){
switch(ch){
case 'I':return 1;
case 'V':return 5;
case 'X':return 10;
case 'L':return 50;
case 'C':return 100;
case 'D':return 500;
case 'M':return 1000;
default:return 0;
}
}
}
3.最后一个单词的长度
先过掉空格,再计算单词。
class Solution {
public int lengthOfLastWord(String s) {
int end=s.length()-1;
//先过掉空格
while(end>=0&&s.charAt(end)==' ') end--;
if(end<0) return 0;
//过掉单词
int start=end;
while(start>=0&&s.charAt(start)!=' ') start--;
return end-start;
}
}
4.最长公共前缀
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0){
return "";
}
String ret=strs[0];
//遍历字符串数组
for(int i=1;i<strs.length;i++){
int j=0;
//遍历字符串
for(;j<ret.length()&&j<strs[i].length();j++){
if(ret.charAt(j)!=strs[i].charAt(j))
break;
}
ret=ret.substring(0,j);
if(ret.equals(""))
return ret;
}
return ret;
}
}
5.反转字符串中的单词
可变的字符串
StringBuilder ret=new StringBuilder();
查找某个位置的字符
s.charAt(i)
分词
s.substring(i,j)
删除首尾空格
//删除首尾空格
s=s.trim();
转为字符串
s.toString().trim()