leetcode 150道题 计划花两个月时候刷完,今天(第七天)完成了5道(15-19)150:
今天这些都是我之前做过的,还有就是今天的全都是模拟过程。。所以做的还算快。
15(13. 罗马数字转整数)
题目描述:
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
第一版(直接模拟过程了,没有啥算法,没有啥技术含量。。想不出来更好的)
class Solution {
public int romanToInt(String s) {
int len=s.length();
int index=0;
int sum=0;
while(index<len){
if(s.charAt(index)=='I'){
if(index+1<len&&s.charAt(index+1)=='V'){
sum+=4;
index++;
}
else if(index+1<len&&s.charAt(index+1)=='X'){
sum+=9;
index++;
}else{
sum+=1;
}
}else if(s.charAt(index)=='X'){
if(index+1<len&&s.charAt(index+1)=='L'){
sum+=40;
index++;
}
else if(index+1<len&&s.charAt(index+1)=='C'){
sum+=90;
index++;
}else{
sum+=10;
}
}
else if(s.charAt(index)=='C'){
if(index+1<len&&s.charAt(index+1)=='D'){
sum+=400;
index++;
}
else if(index+1<len&&s.charAt(index+1)=='M'){
sum+=900;
index++;
}else{
sum+=100;
}
}else if(s.charAt(index)=='V'){
sum+=5;
}else if(s.charAt(index)=='L'){
sum+=50;
}else if(s.charAt(index)=='D'){
sum+=500;
}else if(s.charAt(index)=='M'){
sum+=1000;
}
index++;
}
return sum;
}
}
16 (12. 整数转罗马数字)
题目描述:
和上面这个一样 这个是数字转罗马数字:数字范围为:
1 <= num <= 3999
第一版:(还是模拟过程反着来,但是这个是leetcode中等题。。上面的是简单题)
class Solution {
public String intToRoman(int num) {
StringBuilder sb=new StringBuilder();
while(num!=0){
if(num>=1000){
int qNum=num/1000;
for(int i=0;i<qNum;i++){
sb.append("M");
}
num%=1000;
}else if(num>=100){
int bNum=num/100;
if(bNum==9){
sb.append("CM");
bNum-=9;
}
if(bNum>=5){
sb.append("D");
bNum-=5;
}
if(bNum==4){
sb.append("CD");
bNum-=4;
}
for(int i=0;i<bNum;i++){
sb.append("C");
}
num%=100;
}else if(num>=10){
int sNum=num/10;
if(sNum==9){
sb.append("XC");
sNum-=9;
}
if(sNum>=5){
sb.append("L");
sNum-=5;
}
if(sNum==4){
sb.append("XL");
sNum-=4;
}
for(int i=0;i<sNum;i++){
sb.append("X");
}
num%=10;
}else if(num>=1){
if(num==9){
sb.append("IX");
num-=9;
}
if(num>=5){
sb.append("V");
num-=5;
}
if(num==4){
sb.append("IV");
num-=4;
}
for(int i=0;i<num;i++){
sb.append("I");
}
break;
}
}
return sb.toString();
}
}
17 (58. 最后一个单词的长度)
题目描述:
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
第一版(这题我一看,很快,很快啊 直接 split 然后return 哈哈哈,但是一看解题意思要自己写。。)
class Solution {
public int lengthOfLastWord(String s) {
String[] strs=s.trim().split(" ");
return strs[strs.length-1].length();
}
}
第二版(算是自己写版,其实没必要都有接口了直接用多好,希望笔试时候出题人也能这样想。。)
class Solution {
public int lengthOfLastWord(String s) {
char[] chars=s.toCharArray();
int index=chars.length-1;
int len=0;
while(index>=0){
if(chars[index]!=' '){
break;
}
index--;
}
while(index>=0){
if(chars[index--]!=' '){
len++;
}else{
break;
}
}
return len;
}
}
18 (14. 最长公共前缀)
题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
这个题我知道有个横向和纵向的,但是每次想不到横向的。。。
第一版(纵向的也是好想到的)
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length<=1){
return strs[0];
}
for(int i=0;i<strs[0].length();i++){
char temp=strs[0].charAt(i);
for(int j=1;j<strs.length;j++){
if(i==strs[j].length()||strs[j].charAt(i)!=temp){
return strs[0].substring(0,i);
}
}
}
return strs[0];
}
}
第二版(横向的,我感觉有种逆思维的感觉,不是每次能想出来,他是用其中一个去和剩下的求最长公共序列,然后再用求出来公共序列再去和剩下的求,想法很好但不是很好想)
class Solution {
public String longestCommonPrefix(String[] strs) {
// 在写一下横向的 每次都想不起来横向的
if(strs==null||strs.length<=0){
return "";
}
int count=strs.length;
if(count==1){
return strs[0];
}
String preString=strs[0];
for(int i=1;i<count;i++){
preString=commonPrefix(preString,strs[i]);
if(preString.length()==0){
return preString;
}
}
return preString;
}
public String commonPrefix(String str1,String str2) {
int len1=str1.length();
int len2=str2.length();
int index=0;
while(index<len1&&index<len2
&&str1.charAt(index)==str2.charAt(index)){
index++;
}
return str1.substring(0,index);
}
}
19 (151. 反转字符串中的单词)题目描述:
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
第一版(这个题也有种让自己去实现已经有的api,我只写了一版,没有写自己实现的api…感觉太麻烦了有就用就行了。。)
class Solution {
public String reverseWords(String s) {
String[] strs=s.trim().split(" ");
int len=strs.length;
List<String> temp=new ArrayList();
for(int i=len-1;i>=0;i--){
if(!"".equals(strs[i])){
temp.add(strs[i]);
}
}
// 这个方法真的用的时候很多。。
return String.join(" ",temp);
}
}
加油早点跳槽!!今天就是把之前写过的回顾了一边,还行简单的没忘。。哦,我没有写困难的题目。。
早日跳槽!!