每日1+1题(反转字符串1、2)
344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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
给定一个字符串 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());
}
}