2015年12月

JavaScript 运算符与强制类型转换

对于弱类型语言而言,隐式的类型转换永远是个大坑,你永远不知道什么时候会踩到坑。

好不容易做完了课设,到复习期间大概还有那么几天时间,准备稍微看看红宝书——JavaScript高程,当年什么都不懂看到脑袋爆炸,现在虽然表面上看着写写JavaScript已经没什么问题,实际上对于很多东西依旧不是很清楚。

这次就刚看到一个很好玩的东西。

首先:

1.1 + "1.1" // "1.11.1"
+"1.1" + 1.1 // 2.2
"1.1" - 1.1 // 0
1.1 - "1.1" // 0

这里我们大概需要知道的是,如果一个字符串可以转换为数字(内部调用的是Number()函数),那么在转为数字后可以参与运算了,但是如果是字符串加上数字,那么可以视其为字符串拼接。

比如第一个就是明显的字符串拼接。但是如果加上符号,那么就会先进行一个类型转换,在与后面的数字运算。

而减法不具有拼接效果,因此就是转换啦。

蓝桥杯 基础练习 01字串

对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:

00000

00001

00010

00011

00100

请按从小到大的顺序输出这32种01串。

对于这题,你想到了什么吗?

没错,这题其实是二进制加法的变种,依次递增而已,并没有什么区别。

事实上,上学期写过二进制加法的代码,感觉应该不太难,结果脑子生锈了。

本题没有输入,我们来看看代码吧,因为只是一个二进制累加问题:

- 阅读剩余部分 -

蓝桥杯 基础练习 字母图形

利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

这题的问题不大,关键是找规律,很快我们就看出来,第一行和第一列是字母顺序,而剩下的则是对角线相同的关系。

数字规模也非常小,那就好说了。

import java.util.*;

public class AlphamosicGraphics {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int n = in.nextInt();
        int m = in.nextInt();

        char[][] arr = new char[n][m];

        for (int i = 0; i < n; i++) {
            arr[i][0] = (char)('A' + i);
        }

        for (int i = 0; i < m; i++) {
            arr[0][i] = (char)('A' + i);
        }

        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                arr[i][j] = arr[i - 1][j - 1];
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(arr[i][j]);
            }

            System.out.println("");
        }
    }
}

蓝桥杯 基础练习 十六进制转八进制

这道坑爹题真是让人绞尽脑汁,实际上我觉得大家应该也能感受到,很多看似不难的算法题实际上难度在于——如何处理大数的情况,这道题也是一样。

这题是一道非常好的题,因为我不熟悉Java,对于各种类都不太清楚,也没什么感觉,但这题让我了解到了很多类/方法的差别,很具有学习价值。

给定n个十六进制正整数,输出它们对应的八进制数。
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。

很明显的进制转换,刚开始我们想到的肯定是:既然是Java,大概会有进制转换的函数——一查,当然是有的:

Integer.toOctalString(Integer.valueOf(x, 16))

这个方法的连用也就是将16转成转成10进制再转成八进制。

- 阅读剩余部分 -

蓝桥杯 入门训练 序列求和

这一道题本来应该很简单:

求1+2+3+...+n的值。

简单吧,一个循环就能搞定,看上去是这样,但是事实上,我们要注意到数据规模:

1 <= n <= 1,000,000,000。

本题直接的想法是直接使用一个循环来累加,然而,当数据规模很大时,这种“暴力”的方法往往会导致超时。此时你需要想想其他方法。你可以试一试,如果使用1000000000作为你的程序的输入,你的程序是不是能在规定的上面规定的时限内运行出来。

嗯,那么就会遇到运行的问题。但是这种东西有什么好方法么——答案是,有的,名为等差数列求和公式的东西。

讲到这里,基本上大家也发现了,许多题都是在考你的数学能力。

- 阅读剩余部分 -

蓝桥杯 入门训练 Fibonacci数列

很早写好了一直没写笔记,其实算法是个很微妙的数学问题,简单的题还是难得题基本上感觉都是数学不过关……

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

以前用C语言也写过斐波那契数列,不过内容不同,如果不知道斐波那契是什么的话,可以看看:http://codesky.me/archives/c-fibonacci-series.wind

事实证明,用直接递归求的方法确实不现实,但是人家有提示嘛:

在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

由于在下的数学实在是一团糟,所以根本不知道发生了什么。

- 阅读剩余部分 -

CSS 优雅的在table中居中div

在周五的时候,某同学给我发了一个网页,大致想知道这是怎么实现的。

网址在这里:http://dota2.gamepedia.com/Dota_2_Wiki

屏幕快照 2015-12-27 19.29.36.png

首先思考了一下,第一,是居中,居中我们使用的text-align: center,说真的,这个刚开始我还犹豫了一下,不过发现确实是通过这个实现的。

但是在最后一行两格的情况,会发生最后一行居中而不是这个效果,那么接下来这个效果是怎么做的呢。

它是通过n个计算好长度的div来实现的。该div的width和其他一样而height为0,这样就能实现这种效果了,而n的值应该也是计算好的,或者多加也无所谓,总之是个很微妙的实现方式,也算挺有趣。

具体的demo,有空再来,诸位看官现在可以在此网站右键审查元素。

蓝桥杯 入门训练 圆的面积

最近在刷蓝桥杯的题,主要是比较简单,顺便可以练练自己的Java能力,因为光看书记不住实在不靠谱。

入门训练其实是熟悉OJ,理论上而言没什么好说的,但其实还是有很多疑问的。

比如这道圆的面积:

给定圆的半径r,求圆的面积。
输入包含一个整数r,表示圆的半径。

- 阅读剩余部分 -

HTML 给后端传入数组与check默认值

在使用checkbox中,很多时候,我们其实是要传入数组的,实际上,在

HTML中,只要将name设置为check[]即可。

这样在PHP中获取到的check就是一个数组的形式。

此外,有些时候,即使不勾选,我们依旧需要check拥有一个不勾选的默认值,然而,check默认只有勾选项才会传入值,解决方法挺有意思的:

<input type="hidden" value="0" name="check[{{$list->id}}]">

加入一个相同name的hidden,如果不勾选,就会传入此值,否则,checkbox中的值将会覆盖原值,相当有趣。