Arst挑战者-2022-03-26-第一周

Algorithm

在这里插入图片描述
解题思路一:
暴力循环:回文字串的特征就是前后对称,直接暴力循环,利用一个stack的特性(先进后出),之后在遍历这个栈和原字符串对比,就可以了
时间复杂度:O(n)
源码:

import java.util.Locale;
import java.util.Stack;
class Solution {
    public boolean isPalindrome(String s) {
        if ("".equals(s) || s.length() == 1) {
            return true;
        }
        s = s.replaceAll(" ", "");
        s = s.toLowerCase(Locale.ROOT);
        Stack<Character> stack = new Stack<>();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if ((s.charAt(i)>='0' && s.charAt(i) <='9') || (s.charAt(i) >= 'a' && s.charAt(i) <= 'z')){
                stack.add(s.charAt(i));
                sb.append(s.charAt(i));
            }

        }
        int i = 0;
        while (!stack.isEmpty()) {
            Character pop = stack.pop();
            char c = sb.charAt(i);
            if(c != pop) {
                return false;
            }
            i++;
        }
        return true;
    }
}

解题思路二:
双指针:利用两个指针分别指向初始位置和末尾位置,然后想中间遍历,如果遇见特殊符号,直接跳过。
时间复杂度:O(n)
源码:

import java.util.Locale;
import java.util.Stack;
import java.util.regex.Pattern;
class Solution {
    public boolean isPalindrome(String s) {
        if ("".equals(s) || s.length() == 1) {
            return true;
        }
        s = s.toLowerCase(Locale.ROOT);
        int left = 0;
        int right = s.length()-1;
        while (left < right) {
            char a = s.charAt(left);
            char b = s.charAt(right);
            boolean c = (a >='0' && a <='9') || (a >='a' && a <='z');
            boolean d = (b >='0' && b <='9') || (b >='a' && b <='z');
            if (c && d) {
                if (s.charAt(left) != s.charAt(right)) {
                    return false;
                }
                left++;
                right--;
                continue;
            }
            if (!c) {
                left++;
            }
            if (!d) {
                right--;
            }

        }
        return true;
    }
}

Review

Project Loom: Understand the new Java concurrency model
https://www.infoworld.com/article/3652596/project-loom-understand-the-new-java-concurrency-model.html
学习单词:
address n:地址,演讲
v: 演讲,提出,处理
alternative n:代替物
adj:可代替的;另类的;互不相让的
downside n:缺点
breathtaking adj:惊人的
fiber n:纤维
capture n:捕获
continuation n. 连续,持续;延续物,附加物;(停顿后的)继续,再开始

学习句子:
This model is fairly easy to understand in simple cases
在简单的情况下,这个模型相当容易理解
Listing 1. Launching a thread with traditional Java
运行在传统的java线程上
Listing 2. Creating a virtual thread

Thread.startVirtualThread(
  () -> {
    System.out.println("Hello World");
  }
);

Lower-level async with continuations
可延续的低水平调用
Tail-call elimination
尾部消除调用

3. Tip

分享几个spring中的接口
ImportBeanDefinitionRegistrar
里面只有一个方法
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
此方法中的一般registry.registerBeanDefinition来注册beandefinition。

beanDefinition实际上是 private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256);

它可以搭配
EnvironmentAware
BeanFactoryAware
BeanClassLoaderAware
ResourceLoaderAware
这四个Aware接口使用,保证Aware接口在之前调用
用于注册beanDefinition的,但是要Along with @Configuration and ImportSelector, classes of this type may be provided to the @Import annotation (or may also be returned from an ImportSelector)

注册bean Definition的源码
...上面一些简单的代码
if (hasBeanCreationStarted()) {// 此时说明已经有bean开始创建了,所以需要给beanDefinitionMap加上锁
				// Cannot modify startup-time collection elements anymore (for stable iteration)
				synchronized (this.beanDefinitionMap) {
					this.beanDefinitionMap.put(beanName, beanDefinition);
					List<String> updatedDefinitions = new ArrayList<String>(this.beanDefinitionNames.size() + 1);
					// 同时维护了一个beanDefinitionNames,里面记录了bean注册的顺序
					updatedDefinitions.addAll(this.beanDefinitionNames);
					updatedDefinitions.add(beanName);
					this.beanDefinitionNames = updatedDefinitions;
					if (this.manualSingletonNames.contains(beanName)) {
					// 这里怕有重复的
						Set<String> updatedSingletons = new LinkedHashSet<String>(this.manualSingletonNames);
						updatedSingletons.remove(beanName);
						this.manualSingletonNames = updatedSingletons;
					}
				}
			}
			else {// 这里因为bean还未开始创建所以一点也不担心
				// Still in startup registration phase
				this.beanDefinitionMap.put(beanName, beanDefinition);
				this.beanDefinitionNames.add(beanName);
				this.manualSingletonNames.remove(beanName);
			}
			this.frozenBeanDefinitionNames = null;

protected boolean hasBeanCreationStarted() {
// 看bean创建工作是否已经开始了
		return !this.alreadyCreated.isEmpty();
	}

EnvironmentAware
里面有
void setEnvironment(Environment environment);

Interface to be implemented by any bean that wishes to be notified of the Environment that it runs in.
任何的bean想要知道environment可以实现这个接口

4. Share

https://mp.weixin.qq.com/s/H2toewJKEwq1mXme_iMWkA美团技术-设计模式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值