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

本文介绍了如何反转字符串中的元音字母,以及如何找到两个数组的交集,分别给出了从初级到优化的解决方案,并探讨了时间复杂度。通过比较不同实现,展现了从暴力解法到高效算法的演变,适合面试准备和后端开发学习。
摘要由CSDN通过智能技术生成

小编菜解

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的幂、有效的字母异位词

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值