0.
1.
发现没,与数组遍历、当前元素和前后元素大小比较 相关的都用单调栈
2.
sql运行顺序查一下(运行顺序依次是from、where、group by、select order by。先根据s1.Id进行分组,然后计算(count)组内大于等于score的个数(去重),也就是这个score的排名。)
3.
isstream流的用法。
4.
stoi()函数如果传入的字符串s中含有不是数字的字符,则只会识别到从开头到第一个非法字符之前,如果第一个字符就是非法字符则会报错
atoi和stoi相同点:
①都是C++的字符处理函数,把数字字符串转换成int输出
②头文件都是#include
不同点:
①atoi()的参数是 const char* ,因此对于一个字符串str我们必须调用 c_str()的方法把这个string转换成 const char类型的,而stoi()的参数是const string,不需要转化为 const char*;
②stoi()会做范围检查,默认范围是在int的范围内的,如果超出范围的话则会runtime error!
5.
isalpha()用来判断一个字符是否为字母,如果是字符则返回非零,否则返回零。
isalnum()用来判断一个字符是否为数字或者字母,也就是说判断一个字符是否属于az||AZ||0~9。
isdigit()用来判断一个字符是否为数字
islower()用来判断一个字符是否为小写字母,也就是是否属于a~z。
isupper()和islower相反,用来判断一个字符是否为大写字母。
注:以上均为宏定义,并非真正函数。
6.
7.二叉树中两个结点的距离:https://www.cnblogs.com/wxdjss/p/5698071.html
假设给定的节点为node1,node2,可以分为下面的两种情况:
1)node1是node2的祖先节点或孩子结点,可以理解为两个节点在一条线上。例如:Dist(2,4),Dist(6,1)
2)node1和node2没有直接或间接的父子关系。例如,Dist(4,3),他们需要一个共同的祖先结点1连接起来
假设lca是两个节点的最低公共祖先节点:
Dist(n1,n2)=Dist(root,n1)+Dist(root,n2)-2*Dist(root,lca)
这个公式已经涵盖了上面的两种情况。先找出lca,再求root节点到某个节点的距离就比较简单了。
8.
Java自定义排序:https://blog.csdn.net/qq_37405320/article/details/72862155
基本方法
int compare(Object o1, Object o2) 返回一个基本类型的整型
如果要按照升序排序,
则o1 小于o2,返回-1(负数),相等返回0,o1大o2返回1(正数)return o1-o2;
如果要按照降序排序
则o1 小于o2,返回1(正数),相等返回0,o1大于o2返回-1(负数)return o2-o1;
9. C++ string insert
10 . Java中List, Integer[], int[]的相互转换
除了循环遍历外:流操作
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class Main {public static void main(String[] args) {int[] data = {4, 5, 3, 6, 2, 5, 1};// int[] 转 List<Integer>List<Integer> list1 = Arrays.stream(data).boxed().collect(Collectors.toList());// Arrays.stream(arr) 可以替换成IntStream.of(arr)。// 1.使用Arrays.stream将int[]转换成IntStream。// 2.使用IntStream中的boxed()装箱。将IntStream转换成Stream<Integer>。// 3.使用Stream的collect(),将Stream<T>转换成List<T>,因此正是List<Integer>。// int[] 转 Integer[]Integer[] integers1 = Arrays.stream(data).boxed().toArray(Integer[]::new);// 前两步同上,此时是Stream<Integer>。// 然后使用Stream的toArray,传入IntFunction<A[]> generator。// 这样就可以返回Integer数组。// 不然默认是Object[]。// List<Integer> 转 Integer[]Integer[] integers2 = list1.toArray(new Integer[0]);// 调用toArray。传入参数T[] a。这种用法是目前推荐的。// List<String>转String[]也同理。// List<Integer> 转 int[]int[] arr1 = list1.stream().mapToInt(Integer::valueOf).toArray();// 想要转换成int[]类型,就得先转成IntStream。// 这里就通过mapToInt()把Stream<Integer>调用Integer::valueOf来转成IntStream// 而IntStream中默认toArray()转成int[]。// Integer[] 转 int[]int[] arr2 = Arrays.stream(integers1).mapToInt(Integer::valueOf).toArray();// 思路同上。先将Integer[]转成Stream<Integer>,再转成IntStream。// Integer[] 转 List<Integer>List<Integer> list2 = Arrays.asList(integers1);// 最简单的方式。String[]转List<String>也同理。// 同理String[] strings1 = {"a", "b", "c"};// String[] 转 List<String>List<String> list3 = Arrays.asList(strings1);// List<String> 转 String[]String[] strings2 = list3.toArray(new String[0]);}
}
注意:List list2 = Arrays.asList(integers1);调用 Arrays.asList()时,其返回值类型是ArrayList,但此ArrayList是Array的内部类,比如调用add()时,就会报错:java.lang.UnsupportedOperationException,并且结果会因为array的某个值的改变而改变,所以最好再次构造一个新的ArrayList: List list2 = new ArrayList<>(Arrays.asList(integers1))
1. 二进制1的个数
统计二进制1的个数可以分别获取每个二进制位数,然后再统计其1的个数,此方法效率比较低
计算其 **a &= (a-1)**的结果:
int count_one(int a){int cnt=0;while(a) a=a&(a-1),cnt++;return cnt;
}
2.C++字符串分割
字符串切割的使用频率还是挺高的,string本身没有提供切割的方法,但可以使用stl提供的封装进行实现或者通过c函数strtok()函数实现。
1、通过stl实现
涉及到string类的两个函数find和substr:
1、find函数
原型:size_t find ( const string& str, size_t pos = 0 ) const;
功能:查找子字符串第一次出现的位置。
参数说明:str为子字符串,pos为初始查找位置。
返回值:找到的话返回第一次出现的位置,否则返回string::npos
2、substr函数
原型:string substr ( size_t pos = 0, size_t len = npos ) const;
功能:获得子字符串。
参数说明:pos为起始位置(默认为0),len为字符串长度(默认为npos)
返回值:子字符串
代码如下:
std::vector<std::string> splitWithStl(const std::string &str,const std::string &pattern)
{std::vector<std::string> resVec;if ("" == str){return resVec;}//方便截取最后一段数据std::string strs = str + pattern;size_t pos = strs.find(pattern);size_t size = strs.size();while (pos != std::string::npos){std::string x = strs.substr(0,pos);resVec.push_back(x);strs = strs.substr(pos+1,size);pos = strs.find(pattern);}return resVec;}
2、通过使用strtok()函数实现
原型:char *strtok(char *str, const char *delim);
功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
描述:strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时 则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回被分割出片段的指针。
其它:strtok函数线程不安全,可以使用strtok_r替代。
代码如下:
std::vector<std::string> split(const std::string &str,const std::string &pattern)
{//const char* convert to char*char * strc = new char[strlen(str.c_str())+1];strcpy(strc, str.c_str());std::vector<std::string> resultVec;char* tmpStr = strtok(strc, pattern.c_str());while (tmpStr != NULL){resultVec.push_back(std::string(tmpStr));tmpStr = strtok(NULL, pattern.c_str());}delete[] strc; return resultVec; };