以下为个别问题,我进行详细记录,以便后续参考:
cURL—— 参考https://baike.baidu.com/item/curl/10098606?fr=aladdin;https://baike.baidu.com/item/libcurl/5256898?fr=aladdin
4.1、在表单中,使用get()方法,提交数据:
代码:
那么浏览器上会出现一个文本框和一个标为“OK”的按钮。按下这个按钮,表单就用GET方法向服务器提交文本框的数据。
例如原始页面是在 www.hotmail. com/when/birth.html看到的,然后您在文本框中输入1905,然后按OK按钮,那么浏览器的URL现在应该是:“www.hotmail. com/when/junk.cgi?birthyear=1905&press=OK”
对于这种网页,curl可以直接处理,例如想获取上面的网页,只要输入:
curl "www.hotmail. com/when/junk.cgi?birthyear=1905&press=OK"
就可以了~
4.2、使用POST方法用来提交表单信息,POST方法和GET方法的区别在于GET方法使用的时候,浏览器中会产生目标URL,而POST不会。类似GET,这里有一个网页:
浏览器上也会出现一个文本框和一个标为“OK”的按钮。按下这个按钮,表单用POST方法向服务器提交数据。
这时的URL是看不到的,因此需要使用特殊的方法来抓取这个页面,使用curl来执行这一操作,其命令如下:
curl -d "birthyear=1905&press=OK" www.hotmail. com/when/junk.cgi
参考:https://blog.csdn.net/f1024042400/article/details/52064652
性质:
1、a^(log(a)(b))=b
2、log(a)(a^b)=b
3、log(a)(MN)=log(a)(M)+log(a)(N);
4、log(a)(M÷N)=log(a)(M)-log(a)(N);
5、log(a)(M^n)=nlog(a)(M)
6、利用换底公式:log(x)(y) =log(e)(x) / log(e)(y),我们可以这样做:Math.log(1000*10000) / Math.log(2);
解法一:使用java中数学函数对数的方法解决这个问题的代码:
有一点需要注意:这个函数的返回值为double类型,我是强制转换为int类型的;
/**
* @author 橙橙橙。
* Date:2019年03月28日
* 描述:利用Math封装的函数,求出对数的值
*/
public class AboutLog {
public static void main(String[] args) {
int value = 32;
int base = 2;
int res = logFunction(value, base);
System.out.println(res);
}
//写一个函数,利用换底公式进行计算。换底公式:log(x)(y) =log(e)(x)/log(e)(y)
public static int logFunction(int value, int base) {
return (int) (Math.log(value)/Math.log(base));
}
}
结果如下:
5
解法二:今天看到了博客园上有一个写法,我觉得很好,链接为:https://www.cnblogs.com/daisy0707/p/5279078.html使用位运算进行,看了几遍之后,我也自己写了一下;
在写之前,先复习一下移位是怎么回事?
来自百度百科的说法:移位运算符在程序设计中,是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
更加通俗易懂的说法可以理解为:左移就是给一个数乘2,右移就是给一个数除2;所以,对于任意一个数,我们都可以使用移位的方法来运算出它是否为2的n次方的数;代码如下:
/**
* @author 橙橙橙。
* Date:2019年3月28日
* 描述:使用位运算,实现快速判断某个数是否为2^n所对应的数之一
*/
public class TransBin {
public static void main(String[] args) {
boolean b1 = removeShift(4);
boolean b2 = removeShift(6);
System.out.println("4是否为2的n次方所对应的数: " + b1 + "\n6是否为2的n次方所对应的数: " + b2);
}
public static boolean removeShift(int n) {
//这个判断主要是为了程序的健壮性;
if(n < 1)
return false;
//当n是大于1的整数时,定义一个基数为1
int count = 1;
while(count <= n){ //当我们要检验的这个数小于等于1时,进入循环
if(count == n) //如果两者 相等,则直接返回true
return true;
if(count < n) //如果检验的数较大时,对我们对应的基准数进行左移一位操作。也就是乘2操作
count <<= 1;
System.out.println(count);
}
return false; //如果到了这里还没返回的话,就是false了,例如n=5时
}
}
结果:
2
4
2
4
8
4是否为2的n次方所对应的数: true
6是否为2的n次方所对应的数: false
解法三:根据2与2的n次方所对应的数的特征,使用“与”运算。 2对于的二进制为10,4对应的为100,8对应的为1000……以此类推,2的n次方,对应1后面是n个0,但是当1000 - 1之后,就是0111,1000与0111按位相与,得到的就是0,因此,最简单的方法就是放这个数与它前一位进行相与运算,即可立即算出这个数是否为2的n次方所对应的数!参考:https://www.cnblogs.com/daisy0707/p/5279078.html
代码:
/**
* @author 橙橙橙。
* Date:2019年3月28日
* 描述:使用二进制的特殊性,快速判断一个数是否为2的n次方所对应的数
*/
public class BestMethod {
public static void main(String[] args) {
boolean b1 = SimpePanDuan(1024);
System.out.println("刚才输入的数是否为2的n次方所对应的数? " + b1);
}
public static boolean SimpePanDuan(int n) {
if(n < 1)
return false;
if((n&(n - 1)) == 0)
return true;
return false;
}
}
结果为:
刚才输入的数是否为2的n次方所对应的数? true
public class LinkedNode {
int value;
LinkedNode next;
public LinkedNode(int value) {
this.value = value;
}
}
public static LinkedNode findMidPoint(LinkedNode head) {
if(head == null || head.next == null) {
return head;
}
LinkedNode fastPoint = head; //定义一个快指针,初始位置在头结点
LinkedNode slowPoint = head; //定义一个慢指针,初始位置在头节点
while(fastPoint.next != null) { //如果当前指针的下一个指针不为空
if(fastPoint.next.next != null) { //如果当前指针的下下位指针不为空
slowPoint = slowPoint.next; //如果满足条件,则慢的指针指向下一个节点;
fastPoint = fastPoint.next.next; //快指针指向下一个节点的下一个节点
} else {
slowPoint = slowPoint.next; //如果不满足条件,则指向慢指针的下一个节点
return slowPoint; //此时可以ruturn了
}
}
return slowPoint;
}
其实fastPoint的指向速度是slowPoint速度的二倍?二倍如何体现?方slow的指向为1时,fast为2;当slow为2时,fast指针为4,每次的增加都是在前一次的基础上,而不是fast在slow的基础上添加的。
整体实现如下代码:
/**
* @author 橙橙橙。
* Date:2019年3月31日
* 描述:一个长度未知链表,找出中间节点的值,注意时间复杂度
*/
public class LinkedNode {
int value;
LinkedNode next;
public LinkedNode(int value) {
this.value = value;
}
public static void main(String[] args) {
LinkedNode lick1 = new LinkedNode(3);
LinkedNode node2 = new LinkedNode(5);
LinkedNode node3 = new LinkedNode(6);
LinkedNode node4 = new LinkedNode(8);
LinkedNode node5 = new LinkedNode(10);
LinkedNode node6 = new LinkedNode(19);
LinkedNode node7 = new LinkedNode(20);
LinkedNode node8 = new LinkedNode(30);
//将LinkedNode类的对象连接成一个链表
lick1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
node6.next = node7;
node7.next = node8;
LinkedNode node = findMidPoint(lick1);
System.out.println(node.value);
}
public static LinkedNode findMidPoint(LinkedNode head) {
if(head == null || head.next == null) {
return head;
}
LinkedNode fastPoint = head;
LinkedNode slowPoint = head;
while(fastPoint.next != null) {
if(fastPoint.next.next != null) {
slowPoint = slowPoint.next;
fastPoint = fastPoint.next.next;
} else {
slowPoint = slowPoint.next;
return slowPoint;
}
}
return slowPoint;
}
}
结果如下:
10
加油加油!算法开始入门了~耶