其他分享
首页 > 其他分享> > 反转字符串、反转字符串中的元音字母、两个数组的交集,springboot工作原理面试

反转字符串、反转字符串中的元音字母、两个数组的交集,springboot工作原理面试

作者:互联网

小编菜解

public static String reverseVowels(String s) {

List list = new ArrayList() {{

add(‘a’);

add(‘e’);

add(‘i’);

add(‘o’);

add(‘u’);

}};

char[] chars = s.toCharArray();

int lg = s.length();

int right = s.length();

//遍历字符串前半段,如果是元音,则寻找右半段的最后一个元音,然后交换。

//如果不是则不做处理。

for (int left = 0; left < lg / 2; left++) {

char e = 0;

if (list.contains(chars[left])) {

//寻找右半段的最后一个元音

for (int j = right - 1; j >= 0; j–) {

e = chars[j];

if (list.contains(e)) {

right = j;

break;

}

}

//交换最左元音和最右元音

char temp = chars[left];

chars[left] = e;

chars[right] = temp;

}

}

return new String(chars);

}

感觉list这块有点麻烦。

小编菜解改进版

public static String reverseVowels(String s) {

String const_A_U = “aeiouAEIOU”;

char[] chars = s.toCharArray();

int lg = s.length();

int right = s.length();

//遍历字符串前半段,如果是元音,则寻找右半段的最后一个元音,然后交换。

//如果不是则不做处理。

for (int left = 0; left < lg / 2; left++) {

char e = 0;

if (const_A_U.indexOf(chars[left])>=0) {

//寻找右半段的最后一个元音

for (int j = right - 1; j >= 0; j–) {

e = chars[j];

if (const_A_U.indexOf(e)>=0) {

right = j;

break;

}

}

//交换最左元音和最右元音

char temp = chars[left];

chars[left] = e;

chars[right] = temp;

}

}

return new String(chars);

}

虽然有点麻烦,但好赖思路清晰,感觉可以提交了,但是提示错误。Why?

大佬指点江山

public static String reverseVowels(String s) {

String const_AE = “aeiouAEIOU”;

char[] chars = s.toCharArray();

int lg = s.length();

int left = 0;

int right = lg - 1;

//遍历字符串前半段,如果是元音,则寻找右半段的最后一个元音,然后交换。

//如果不是则不做处理。

while (left < right) {

//如果不是元音

while (left < lg && const_AE.indexOf(chars[left]) < 0) {

++left;

}

//如果不是元音

while (right > 0 && const_AE.indexOf(chars[right]) < 0) {

–right;

}

if (left < right) {

char temp = chars[left];

chars[left] = chars[right];

chars[right] = temp;

++left;

–right;

}

}

re

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

turn new String(chars);

}

大佬的思路和我的是一样的,但是利用双指针进行操作明显比我的前半段后半段,更加直观简洁。

3、LeetCode 349.两个数组的交集


题目

给定两个数组,编写一个函数来计算它们的交集。

小编菜解

public static int[] intersection(int[] nums1, int[] nums2) {

Set set = new HashSet<>();

for (int i = 0; i < nums1.length; i++) {

for (int j = 0; j < nums2.length; j++) {

if (nums1[i] == nums2[j]){

set.add(nums1[i]);

}

}

}

int[] arr = new int[set.size()];

int i = 0;

for (int s : set) {

arr[i] = s;

i++;

}

return arr;

}

虽然解决了问题,提交成功了,但是总感觉,菜的令人发指,不是很满意。

小编菜解的时间复杂度是O(mn),也就是传统意义上的暴力算法,不建议采用。

思想及算法

如果使用哈希集合存储元素,则可以在 O(1)O(1) 的时间内判断一个元素是否在集合中,从而降低时间复杂度。

首先使用两个集合分别存储两个数组中的元素,然后遍历较小的集合,判断其中的每个元素是否在另一个集合中,如果元素也在另一个集合中,则将该元素添加到返回值。该方法的时间复杂度可以降低到 O(m+n)O(m+n)。

大佬指点江山

public static int[] intersection(int[] nums1, int[] nums2) {

Set set1 = new HashSet<>();

Set set2 = new HashSet<>();

for (int i = 0; i < nums1.length; i++) {

set1.add(nums1[i]);

}

for (int i = 0; i < nums2.length; i++) {

set2.add(nums2[i]);

}

return getIntersection(set1, set2);

}

public static int[] getIntersection(Set set1, Set set2) {

if (set1.size()>set2.size()){

return getIntersection(set2,set1);

}

Set set = new HashSet<>();

for (Integer x : set1){

if (set2.contains(x)){

set.add(x);

}

}

int[] ret = new int[set.size()];

int i = 0;

for (Integer x : set){

ret[i++] = x;

}

return ret;

}

代码貌似更繁琐了,但重要的是这个思想,尽量避免多重for循环。

时间复杂度不一样,执行用时提升显著。

推荐阅读

【100天算法入门 - 每日三题 - Day12】Nim游戏、3的幂、4的幂

【100天算法入门 - 每日三题 - Day11】丢失的数字、移动零、单词规律

【100天算法入门 - 每日三题 - Day10】二叉树的所有路径、各位相加、丑数

【100天算法入门 - 每日三题 - Day9】汇总区间、2的幂、有效的字母异位词

标签:right,springboot,int,反转,chars,元音,String,字符串,left
来源: https://blog.csdn.net/m0_64867896/article/details/121843375