[LC]345. Reverse Vowels of a String

一、问题描述

Write a function that takes a string as input and reverse only the vowels of a string.

Example 1:
Given s = "hello", return "holle".

Example 2:
Given s = "leetcode", return "leotcede".

Note:
The vowels does not include the letter "y".

二、我的解法

既然要颠倒,我就从头尾开始遍历字符串。从头部遍历的第一个元音替换成尾部遍历的第一个元音;如果不是元音则不替换。终止条件是从头遍历到尾一遍。

我的又臭又长的代码:

class Solution {
    public String reverseVowels(String s) {
        char[] c = s.toCharArray();
        char[] retC = new char[c.length];
        List<Character> vovels = new ArrayList<Character>();
        vovels.add('a');
        vovels.add('e');
        vovels.add('i');
        vovels.add('o');
        vovels.add('u');
        vovels.add('A');
        vovels.add('E');
        vovels.add('I');
        vovels.add('O');
        vovels.add('U');
        
        int i, j;
        for(i = 0, j = c.length - 1; i < c.length; i ++){
            if(vovels.contains(s.charAt(i))){
                while(j >= 0){
                    if(vovels.contains(c[j])){
                        retC[i] = c[j];
                        j --;
                        break;
                    }
                    j --;
                 }
                
            }
            else{
                retC[i] = s.charAt(i);
            }
        }
        return new String(retC);
    }
}


三、淫奇技巧

见证自己代码和思路多烂的时候到了!

public class Solution {
public String reverseVowels(String s) {
    if(s == null || s.length()==0) return s;
    String vowels = "aeiouAEIOU";
    char[] chars = s.toCharArray();
    int start = 0;
    int end = s.length()-1;
    while(start<end){
        
        while(start<end && !vowels.contains(chars[start]+"")){
            start++;
        }
        
        while(start<end && !vowels.contains(chars[end]+"")){
            end--;
        }
        
        char temp = chars[start];
        chars[start] = chars[end];
        chars[end] = temp;
        
        start++;
        end--;
    }
    return new String(chars);
}

思路上的差距: 我的思路是从头遍历一个一个动,找到元音后尾部移动到下一个元音,然后替换。然而人家是直接交换头尾!加起来遍历一遍就行了!

代码的差距:看看人家查找char是不是元音的方法!多高级多好写!再看看我的……


四、知识点

1. 查找char是否属于某个set的方法,除了Map以外,还有写一个String s=“abcde”,然后用s.contains(c + "")查找即可!具体内部实现的复杂度和HashMap有什么不同还需要深究一下~

2. char[]和String的转换方法:

char[] myString = new char[] {'T', 'H', 'I', 'S', ' ',  'I', 'S', ' ', 'T', 'E', 'S', 'T'};
 
		String output1 = new String(myString);
		System.out.println("output1 : " + output1);
 
		String output2 = String.valueOf(myString);
		System.out.println("\noutput2 : " + output2);
摘自:http://crunchify.com/java-two-ways-to-convert-char-array-to-string/

五、问题

暂无


六、碎碎念

这些题目还挺重视思维缜密度的。比如字符串为空;比如元音还有大小写的情况吖。

最近事情好多,刷题不能怂,抓紧抓紧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值