每日一题(不等长替换)+java学习
题目:剑指Offer 05.替换空格
请实现一个函数,把字符串 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);
}
}