LOADING

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

2023/10/30

每日1+1题(反转字符串1、2)

344.反转字符串

力扣题目链接(opens new window)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
输入:[“h”,”e”,”l”,”l”,”o”]
输出:[“o”,”l”,”l”,”e”,”h”]

示例 2:
输入:[“H”,”a”,”n”,”n”,”a”,”h”]
输出:[“h”,”a”,”n”,”n”,”a”,”H”]

541. 反转字符串II

力扣题目链接(opens new window)

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例:

输入: s = “abcdefg”, k = 2
输出: “bacdfeg”

//手写反转字符
// Created by 徐昊岩 on 2023/10/30.
//
#include <algorithm>
#include "vector"
#include "string"
#include "iostream"
using namespace std;
class Solution {
public:
    void reverseString(vector<char>& s) {
        auto a=s.begin();
        auto b=s.end()-1; //end不指向任何元素,记得-1!!!
        char t;
        while(a<b){
            t=*a;
            *a=*b;
            *b=t;
            a++;
            b--;
        }
    }
};
class Solution2 {
public:
    string reverseStr(string s, int k) {
        auto p=s.begin();
        auto begin=s.begin();
        int count=1;
        while (p!=s.end()){
            if(count%(2*k)==0){
                reverse(begin,begin+k);  //algorithm库的reverse实际反转的是[first,end)!!!!!
                begin=p+1;
            }
            if(s.end()-begin<k){
                reverse(begin,s.end());
                break;
            } else if(s.end()-begin<2*k && s.end()-begin>=k){
                reverse(begin,begin+k);
                break;
            }
            p++;
            count++;
        }
        return s;
    }
};
class Solution3 {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += (2 * k)) { //此题其实每次前进2*k个元素即可
            // 1. 每隔 2k 个字符的前 k 个字符进行反转
            // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if (i + k <= s.size()) {
                reverse(s.begin() + i, s.begin() + i + k );
            } else {
                // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
                reverse(s.begin() + i, s.end());
            }
        }
        return s;
    }
};
int main(){
    string a="nihao";
    std::reverse(a.begin(), a.end()-1);
    cout<<a;
}

java学习

学到反射了,java的对象体系确实复杂,还是要多用才能体会到

package java_learning;
import java_basic.Boy;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

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调用
    }
    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());
    }
}