二分
模板数组: 3 4 4 5 5 5 6 7
找到第一个大于5的元素
// 数组下标从1开始bool isBlue(int x){ if(x<=5) return true; else return false;}int l=1, r=9; while(l+1!=r){ int mid = (l+r)/2; if(isBlue(q[mid])){ l=mid; }else{ r=mid; }}return r;
找到最后一个小于等于5的元素的位置(下标)
// 数组下标从0开始bool isBlude(int x){ if(x<=5) return true; else return false;}int l=-1, r=8;while(l+1!=r){ int mid = (l+r)>>1; if(isBlue(q[mid])){ l=mi ...
DFS
跳台阶一个楼梯共有 nn 级台阶,每次可以走一级或者两级,问从第 00 级台阶走到第 nn 级台阶一共有多少种方案。
输入格式共一行,包含一个整数 nn。
输出格式共一行,包含一个整数,表示方案数。
数据范围1≤n≤151≤n≤15
输入样例:5
输出样例:8
#include<bits/stdc++.h>using namespace std;int f(int n){ if(n==1) return 1; if(n==2) return 2; return f(n-1)+f(n-2);}int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin>>n; cout<<f(n)<<endl; return 0;}
递归实现指数型枚举从 1∼n1∼n 这 nn 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式输入一个整数 nn。
输出格式每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰 ...
模拟基础
输入输出cin/cout 与 scanf/print
万能头文件#include
cin 与 cout 是 C++ 提供的函数输入输出方便但速度较慢,所以需 要用指令进行输入输出加速,切记使用加速命令后不要同时使用 cin/cout 与 scanf/printf
#include<bits/stdc++.h>using namespace std;int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int x, y; cin >>x >> y; cout << y << endl << x; return 0;}
scanf 与 printf 其实是 C 语言提供的函数。大多数情况下,它们 的速度比 cin 和 cout 更快,并且能够控制输入输出格式
%s 表示字符串。
%c 表示字符。
%lf 表示双精度浮点数 ( double ) 。
% ...
淘最热点
前置知识SHA-1算法SHA1的java实现MessageDigest sha1 = MessageDigest.getInstance("SHA-1");sha1.update("xiaojianbang".getBytes());sha1.digest();
特点摘要长度为160bit
加密后的字节数组可以编码成Hex、Base64
没有任何输入,也能计算hash值
初始化常量0x674523010xEFCDAB890x98BADCFE0X103254760XC3D2E1F0
AES算法根据长度不同,可以分成 AES-128、AES-192、AES-256
AES
密钥长度(比特)
分组长度(比特)
向量长度(比特)
加密轮数
AES-128
128
128
128
10
AES-192
192
128
128
12
AES-256
256
128
128
14
AES的java实现SecretKeySpec key = new SecretKeySpec("1234567890abcdef". ...
初探So
枚举各种枚举导入表通过枚举导入表,可以得到出现在导入表中的函数地址
var imports = Module.enumerateImports("libencryptlib.so");for(var i = 0; i < imports.length; i++){ console.log(JSON.stringify(imports[i]));}
枚举导出表通过枚举导出表,可以得到出现在导出表中的函数地址
var exports = Module.enumerateImports("libencryptlib.so");for(var i = 0; i < exports.length; i++){ console.log(JSON.stringify(exports[i]));}
枚举符号表通过枚举符号表,可以得到出现在符号表中的函数地址
var symbols = Module.enumerateSymbols("libencryptlib.so");fo ...
自定义View1-4Canvas对绘制的辅助
1 范围裁切范围裁切有两个方法: clipRect() 和 clipPath()。裁切方法之后的绘制代码,都会被限制在裁切范围内。
1.1 clipRect()使用很简单,直接应用,记得要加上 Canvas.save() 和 Canvas.restore() 来及时恢复绘制范围。
canvas.save()canvas.clipRect(left, top, right, bottom)canvas.drawBitmap(bitmap, x, y, paint)canvas.restore()
1.2 clipPath()其实和 clipRect() 用法完全一样,只是把参数换成了 Path ,所以能裁切的形状更多一些:
canvas.save();canvas.clipPath(path1);canvas.drawBitmap(bitmap, point1.x, point1.y, paint)canvas.restore()canvas.save()canvas.clipPath(path2)canvas.drawBitmap(bitmap, point2.x, point2.y ...
自定义View 1-3drawText()文字的绘制
1 Canvas 绘制文字的方式Canvas 的文字绘制方法有三个:drawText() drawTextRun() 和 drawTextOnPath()。
1.1 drawText(String text, float x, float y, Paint paint)drawText() 是 Canvas 最基本的绘制文字的方法:给出文字的内容和位置, Canvas 按要求去绘制文字。
val text = "Hello HenCoder"canvas.drawText(text, 200f, 100f, paint)
1.2 drawTextRun()drawTextRun() 是在 API 23 新加入的方法。它和 drawText() 一样都是绘制文字,但加入了两项额外的设置——上下文和文字方向——用于辅助一些文字结构比较特殊的语言的绘制。
额外设置一:上下文。
有些语言的文字,字符的形状会互相之间影响:一个字你单独写是一个样,和别的字放在一起写又是另外一个样。
不过我们就不用管它为什么这么神奇了,也不用替阿拉伯人操心这么复杂的文字他们使用起来会不会很 ...
自定义View2 Paint
自定义View1-2 Paint详解1颜色Canvas绘制的内容,有三层对颜色的处理:
基本颜色:1、Canvas.drawColor/ARGB() –颜色参数 2、Canvas.drawBitmap()–bitmap参数 3、Canvas图形和文字绘制–paint参数。
ColorFilter:Paiint.setColorFilter(CorlorFilter)。
Xfermode:Paint.setXfermode(Xfermode)。
1.1 基本颜色像素的基本颜色,根据绘制内容的不同而有不同的控制方式:
Canvas的颜色填充类方法drawColor/RBG/ARGB() 直接作为参数传入。
drawBitmap()的颜色与bitmap参数的像素颜色相同。
图形和文字(drawCircle()/drawPath()/drawText()…) 在paint参数中设置。
Paint设置颜色的方法有两种:一种是直接用 Paint.setColor/ARGB() 来设置颜色,另一种是使用 shader 来指定着色方 ...
入门ndk
So中常用的Log输出#include<android/log.h>#define TAG "xiaojianbang"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__);#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__);#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__);
NDK多线程JavaVM每个进程中只有一份
JNIEnv每个线程中都有一份
//线程id,其实就是longpthread_t thread;//线程id 线程属性 函数 传递给函数的参数pthread_create(&thread, nullptr, myThread, nullptr);//等待线程执行完毕//默认的线程属性是joinable 随着主线程结束而结束//线程属性是det ...
android逆向基础
cmd常用快捷键新选项卡: ctrl+shift+d/t
划分窗格: alt+shift+d/加号/减号
关闭窗格: ctrl+shift+w
调整窗格: alt+shift+方向键
窗格切换: alt+方向键
Java位运算符右移>>4 -> 0000 01004 >> 1 -> 0000 0010
Hex编码1 byte = 8 bit每个十六进制数对应4个二进制位
数组初始化方法静态初始化元素类型[] 数组名 = new 元素类型[]{元素,元素,、、、}int[] arr = new int[]{1,2,3,4,5}int[] arr = {1,2,3,4,5}相当于int[] arr = new int[5]arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; arr[4] = 5
动态初始化元素类型[] 数组名 = new 元素类型[数组长度]int[] arr = new int[5]
二维数组定义 ...