赞
踩
以下为个别问题,我进行详细记录,以便后续参考:
cURL—— 参考https://baike.baidu.com/item/curl/10098606?fr=aladdin;https://baike.baidu.com/item/libcurl/5256898?fr=aladdin
4.1、在表单中,使用get()方法,提交数据:
代码:
- <form method="GET" action="junk.cgi">
- <input type=text name="birthyear">
- <input type=submit name=press value="OK">
- </form>
那么浏览器上会出现一个文本框和一个标为“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,这里有一个网页:
- <form method="POST" action="junk.cgi">
- <input type=text name="birthyear">
- <input type=submit name=press value="OK">
- </form>
浏览器上也会出现一个文本框和一个标为“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
加油加油!算法开始入门了~耶
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。