LOADING

加载过慢请开启缓存 浏览器默认开启

2023/10/31

每日一题(不等长替换)+java学习

题目:剑指Offer 05.替换空格

力扣题目链接(opens new window)

请实现一个函数,把字符串 s 中的每个空格替换成”%20”。

示例 1: 输入:s = “We are happy.”
输出:”We%20are%20happy.”

//不等长替换问题
// Created by 徐昊岩 on 2023/10/31.
//有个通解:先统计需要替换的字符个数,然后再从后往前用双指针法依次替换
#include "string"
#include "algorithm"
using namespace std;
class Solution {
public:
    string pathEncryption(string path) {
        int count=0;
        int size=path.size();
        for(int i=0;i< size;i++){
            if(path[i]==' ') count++;
        }
        size=size-1;
        path.resize(size+count*2);
        int o=path.size()-1;  //由于CPP中string可以直接使用索引,因此用int类型作为“指针”即可
        //另外,在C++中,string类会提供 size接口,用size来判断string类字符串是否结束,而不是用'\0'来判断是否结束。
        for(size;size>0;size--){
            if(path[size]==' '){
                path[o]='0';
                o--;
                path[o]='2';
                o--;
                path[o]='%';
            } else{
                path[o]=path[size];
            }
            o--;
        }
    }
};

java学习,反射学完了

package java_learning;
import java_basic.Boy;

import java.lang.reflect.*;

public class reflection {
    //反射是为了解决在运行期,对某个实例一无所知但需要调用其方法的情况
    //通过Class实例(JVM为每一个加载到内存中的class创建的Class实例)获取class信息的方法称为反射(Reflection)。
    public static void main(String args[]) throws Exception {
        Class cls = Boy.class;
        printClassInfo("".getClass());
        //printClassInfo(Runnable.class);
        //printClassInfo(java.time.Month.class);
        //printClassInfo(String[].class);
        //printClassInfo(int.class);
        System.out.println(cls.getDeclaredField("age")); //这里有个未处理报错
        //unhandledException编译错误是提醒你需要处理可能的异常的
        //getField只能获取public字段,要想获取私有字段需要getDeclaredField
        Boy b1=new Boy();
        Class cls_b1=Boy.class; //Class是用来展示底层信息的,方法字段的类型、修饰符等
        Field f_b1=Boy.class.getDeclaredField("name");
        f_b1.setAccessible(true); //访问私有字段是会出现Exception的,但可以设置为可以获取,这样就能访问无论什么限制符的字段了
        System.out.println(f_b1.get(b1));
        f_b1.set(b1,"水桶"); //通过反射机制改变私有字段,属实越界了
        //但有时候setAccessible可能会失败,如果JVM运行期存在SecurityManager,那么它会根据规则进行检查,有可能阻止setAccessible(true)
        System.out.println(b1.getName());
        System.out.println(Boy.class.getMethod("shout")); //getMethod第一个参数要写函数名,后边要写函数参数的Class,这样才可以识别重载的函数
        //似乎无法获得构造方法?
        //System.out.println(cls_b1.getMethod("Boy"));
        //System.out.println(cls_b1.getMethod("Boy",String.class,int.class));
        Method m_b1=Boy.class.getMethod("shout");
        m_b1.invoke(b1); //字段是Field对象get获取,方法是Method对象invoke调用
        m_b1=Boy.class.getDeclaredMethod("good");
        m_b1.setAccessible(true); //setAccessible是非静态方法,要想调用必须实例化
        m_b1.invoke(Boy.class);  //非public方法必须设置setAccessible(true)才能真正调用
        Constructor c_b1=Boy.class.getConstructor(String.class,int.class);
        Boy b2=(Boy) c_b1.newInstance("nihao",15);
        Class b_father=cls_b1.getSuperclass();
        System.out.println(b_father); //自己定义的类都是继承于java.lang.Object,但java的一些内置类不是
        //接口属于抽象类,不能被实例化,但仍然可以通过向上转型获得实例
        //除了上述向上转型,还可以通过动态代理机制获得其实例
        InvocationHandler handler=new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println(method);
                if(method.getName().equals("morning")){
                    System.out.println("Good morning, " + args[0]);
                }
                return null;
            }
        };
        //看到@Override就知道,其实只是JVM自动帮我们编写了个继承于接口的类
        /* 类长这样:只是通过Class调用invoke来执行接口的方法罢了
        public class HelloDynamicProxy implements Hello {
        InvocationHandler handler;
        public HelloDynamicProxy(InvocationHandler handler) {
            this.handler = handler;
            }
        public void morning(String name) {
            handler.invoke(
            this,
            Hello.class.getMethod("morning", String.class),
            new Object[] { name });
            }
        }
         */
        Hello hello=(Hello) Proxy.newProxyInstance(
                Hello.class.getClassLoader(),
                new Class[]{Hello.class},
                handler);
        hello.morning("Bob");

    }
    static void printClassInfo(Class cls) {
        System.out.println("Class name: " + cls.getName());
        System.out.println("Simple name: " + cls.getSimpleName());
        if (cls.getPackage() != null) {
            System.out.println("Package name: " + cls.getPackage().getName());
        }
        System.out.println("is interface: " + cls.isInterface());
        System.out.println("is enum: " + cls.isEnum());
        System.out.println("is array: " + cls.isArray());
        System.out.println("is primitive: " + cls.isPrimitive());
    }
    interface Hello{
        void morning(String name);
    }

}