Johnny's Blog

Record every step


  • Home

  • Tags

  • Categories

  • Archives

  • Search

UEFI下的Grub2重装

Posted on 2018-08-06

由于加入了Windows Insider计划,win10频繁更新,在某次更新中丢失了grub2的引导,开机默认进入Windows Boot Manager,无法进入Debian。于是便开始查找各种资料修复grub2。

本机环境

系统:Windows 10(位于SSD) + Debian stretch(位于HDD)
引导方式:UEFI (SSD和HDD均为GPT分区)

使用工具

  • 使用rufus制作的Debian Live USB启动盘

修复步骤

  1. 重启并按F7(本机为神舟系列,请根据机型自行更改)进入启动菜单,选择USB进入Debian Live环境(建议选择纯英文的Debian Live,中文环境下终端会出现乱码)
  2. 打开终端,使用sudo passwd root修改root用户密码(因为不知道Debian Live中root用户默认密码)
  3. 输入su切换到root用户下(防止每次命令前都要输入sudo)
  4. 使用fdisk -l查看各磁盘分区信息,找到efi(boot)和linux 根目录对应的分区
  5. 挂载各个分区,假设efi分区为sda2,根目录为sda3

    mount /dev/sda3 /mnt              //将/mnt挂载为根目录
    mount /dev/sda2 /mnt/boot/efi
    mount -t proc /proc /mnt/proc     //使用-t指定挂载类型,挂载proc文件系统
    mount -t sysfs /sys /mnt/sys      //挂载sysfs文件系统
    mount -o bind /dev /mnt/dev          //亦可使用mount --bind,将live系统中的/dev挂载到/mnt/dev
    mount -t devpts devpts /mnt/dev/pts
    chroot /mnt     将/mnt作为系统根目录    
    
  6. 重装grub2

    grub-install /dev/sda2 --targe=x86_64-efi      //默认安装32位,需使用参数指定为64位
    update-grub2
    
  7. 重启即可

翻转数列-腾讯2018春招技术类编程题

Posted on 2018-07-26 | In programming

[编程题] 翻转数列

小Q定义了一种数列称为翻转数列:
给定整数n和m, 满足n能被2m整除。对于一串连续递增整数数列1, 2, 3, 4…, 每隔m个符号翻转一次, 最初符号为’-‘;。
例如n = 8, m = 2, 数列就是: -1, -2, +3, +4, -5, -6, +7, +8.
而n = 4, m = 1, 数列就是: -1, +2, -3, + 4.
小Q现在希望你能帮他算算前n项和为多少。

时间限制:1秒
空间限制:32768K
题目来源:腾讯2018春招技术类编程题汇总—牛客网

输入描述:

输入包括两个整数n和m(2 <= n <= 10^{9}, 1 <= m), 并且满足n能被2m整除

输出描述:

输出一个整数,表示前n项和。

输入样例:

8 2

输出样例:

8

解题过程

最开始写代码时,没有注意到输入范围使用了int导致出错,然后更改为如下代码:

public class Main {   //直接法(最慢)
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n, m, sum = 0;
        ArrayList<Long> array = new ArrayList<Long>();
        n = sc.nextLong();
        m = sc.nextLong();
        if (n >= 2 && n % (2 * m) == 0) {
            long i = 0, k = 1;
            boolean flag = true;
            while (i < n) {
                if (i % m == 0) {
                    flag = !flag;
                }
                if (flag) {
                    array.add(new Long(k));
                    sum += k;
                } else {
                    array.add(new Long(0 - k));
                    sum -= k;
                }
                i++;
                k++;
            }
            System.out.println(sum);
        } else {
            System.out.println("输入有误");
        }
    }
}

但是,当输入数值较大的时候此方法运行时间不能满足题目要求,且可能会导致内存溢出,如下图:

因此对题目再次仔细观察后发现数列前后相加刚好是从n-1开始,公差为2的等差数列(忽略符号),所以将代码修改如下:

public class Main{    //优化后解法
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        long n,m,sum=0;
        n=sc.nextLong();
        m=sc.nextLong();
        if (n >= 2 && n % (2 * m) == 0) {
            boolean flag=false;
            for(long i=0,k=n-1;i<n/2;i++){
                if (i % m == 0) {
                    flag = !flag;
                }
                if (flag) {
                    sum += k;
                } else {
                    sum -= k;
                }
                k-=2;
            }
            System.out.println(sum);
        }else{
            System.out.println("输入有误");
        }
    }
}

再次提交运行,发现还是超时,然后通过百度搜索相关博客后找到了最简洁高效的代码:

public class Main{    //最优解
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        long n,m,sum=0;
        n=sc.nextLong();
        m=sc.nextLong();
        if (n >= 2 && n % (2 * m) == 0) {
            sum=n*m/2;
            System.out.println(sum);
        }else{
            System.out.println("输入有误");
        }
    }
}

试题分析

题目中有提到,n能被2m整除,因此尝试将数列划分为长度为2m的一小段来进行找规律。
比如题目中的输入为

8 2  

数列为

-1  -2  3  4  -5  -6  7  8

第一个长度为2m(m=2)的数列为

-1 -2 3 4 

观察到-1+3=-2+4,即m+1项减去第1项等于m,又因为长度是2m,所以共有m个这样的组合,即和为m*m,第二个长度为2m的数列同样如此,因此长度为n时其和为n/2*m
最后要注意从键盘获取long型数值要使用nextLong()

XML 入门

Posted on 2018-07-24 | In languages

什么是 XML?

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准

XML 与 HTML 的主要差异

  • XML 不是 HTML 的替代。
  • XML 和 HTML 为不同的目的而设计:
  • XML 被设计为传输和存储数据,其焦点是数据的内容。
  • HTML 被设计用来显示数据,其焦点是数据的外观。
  • HTML 旨在显示信息,而 XML 旨在传输信息

XML 的结构

XML 文档第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码
<?xml version="1.0" encoding="UTF-8"?>

XML 文档是树结构的,它有且仅有一个根元素。
根元素是所有其他元素的父元素。
XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。类似 HTML 中的标签,所有元素均可拥有文本内容和属性。
示例:

<root>
      <child>
        <subchild>.....</subchild>
      </child>
</root>

XML 的语法

XML 的语法规则很简单,且很有逻辑,易于学习。

  • 所有 XML 元素都须有关闭标签
  • XML 标签对大小写敏感
  • XML 必须正确地嵌套
  • XML 文档必须有根元素
  • XML 的属性值须加引号(单引号和双引号皆可)
  • 标签中的尖括号等特殊字符需用实体引用替代
实体引用 符号 符号名称
&lt; < 小于(Less than)
&gt; > 大于(Greater than)
&amp; & 与符号(Ampersand)
&apos; ' 单引号(Apostrophe)
&quot; " 双引号(Quotation mark)
  • XML 中的注释同 HTML <!--这里是注释-->
  • 在 XML 中,空格会被保留

    HTML 会把多个连续的空格字符裁减(合并)为一个

  • XML 以 LF 存储换行

    在 Windows 应用程序中,换行通常以一对字符来存储:回车符 (CR) 和换行符 (LF)。这对字符与打字机设置新行的动作有相似之处。在 Unix 应用程序中,新行以 LF 字符存储。而 Macintosh 应用程序使用 CR 来存储新行。

    CR用符号’\r’表示, 十进制ASCII代码是13, 十六进制代码为0x0D,
    LF使用’\n’符号表示, ASCII代码是10, 十六制为0x0A,
    Dos和windows采用回车+换行(CRLF)表示下一行。

XML 元素命名规则

XML 元素必须遵循以下命名规则:

  • 名称可以含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字符 “xml”(或者 XML、Xml)开始
  • 名称不能包含空格

可使用任何名称,没有保留的字词。

最佳命名习惯
  1. 使名称具有描述性。
  2. 使用下划线的名称也很不错。
  3. 名称应当比较简短,比如:<book_title>,而不是:<the_title_of_the_book>。
  4. 避免 “-“ 字符。如果您按照这样的方式进行命名:”first-name”,一些软件会认为你需要提取第一个单词。
  5. 避免 “.” 字符。如果您按照这样的方式进行命名:”first.name”,一些软件会认为 “name” 是对象 “first” 的属性。
  6. 避免 “:” 字符。冒号会被转换为命名空间来使用。
  7. XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。有一个实用的经验,即使用数据库的名称规则来命名 XML 文档中的元素。
  8. 非英语的字母比如 éòá 也是合法的 XML 元素名,不过需要留意当软件开发商不支持这些字符时可能出现的问题。

XML 元素属性

XML 元素可以在开始标签中包含属性,类似 HTML 。属性(Attribute)提供关于元素的额外(附加)信息。XML 属性基本语法:
<元素 属性1="属性值" 属性2="属性值">元素内容</元素>

注意事项:

  1. 属性值用双引号(")或单引号(')分隔(如果属性值中有',用"分隔;有",用'分隔)。
  2. 一个元素可以有多个属性。
  3. 属性名称在同一个元素标记中只能出现一次。
  4. 属性值不能包括<, >, &之类的特殊字符,否则需要使用转义字符

在 XML 文档中应该尽量避免使用 XML 属性,因使用属性而引起的一些问题:

  • 属性无法包含多重的值(元素可以)
  • 属性无法描述树结构(元素可以)
  • 属性不易扩展(为未来的变化)
  • 属性难以阅读和维护

请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。
实例:

<!--使用 date 属性-->
<note date="08/08/2008">
   <to>George</to>
   <from>John</from>
   <heading>Reminder</heading>
   <body>Don't forget the meeting!</body>
</note>

<!--使用 date 元素-->
<note>
  <date>08/08/2008</date>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note> 

<!--使用拓展的 date 元素(W3C推荐使用)-->
<note>
  <date>
     <day>08</day>
     <month>08</month>
     <year>2008</year>
  </date>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

XML 的验证

XML 中,拥有正确语法的 XML 被称为“形式良好”的 XML。
通过 DTD(Document Type Definition,文档类型定义) 验证的 XML 是“合法”的 XML。

XML DTD

DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构。

内部的 DOCTYPE 声明

假如 DTD 被包含在 XML 文件中,它应当包装在一个 DOCTYPE 声明中。
<!DOCTYPE 根元素 [元素声明]>

实例:

<?xml version="1.0"?>
<!DOCTYPE note [
     <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to      (#PCDATA)>
    <!ELEMENT from    (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body    (#PCDATA)>
]>
<note>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
</note>

<!--以上 DTD 解释如下:
!DOCTYPE note 定义此文档是 note 类型的文档。
!ELEMENT note 定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT name (type) 定义元素的名称和类型-->
外部引用声明

外部DTD按其性质又可分为本地的和公共的。
(1)当引用的DTD文件是本地文件的时候,用SYSTEM标识,并写上”DTD的文件路径”,如下:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
(2)如果引用的DTD文件是一个公共的文件时,采用PUBLIC标识,如下方式:
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">

XML——XML文件约束之DTD详解

XML Schema

XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),它是基于 XML 的 DTD 替代者。
类似于 DTD , XML Schema 的作用是定义 XML 文档的合法构建模块。XML Schema 在 2001 年 5 月 2 日成为 W3C 标准。

Schema 教程——W3school

XML 显示样式

XML 支持通过 CSS(层叠样式表)对 XML 文档中各元素的显示样式进行修饰,但是使用 CSS 格式化 XML 不是常用的方法,更不能代表 XML 文档样式化的未来。W3C 推荐使用 XSLT。
XSLT 是首选的 XML 样式表语言。XSLT (eXtensible Stylesheet Language Transformations) 远比 CSS 更加完善。

<?xml-stylesheet type=样式类型(CSS/XSLT) href=文件url?>

CSS 教程——W3school
XSLT 教程——W3school

参考教程

XML 教程——W3school

Markdown简易入门

Posted on 2018-07-22 | In languages

Markdown简介

Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容 本身而非排版。它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML、PDF 以及本身的 .md 格式的文件。因简洁、高效、易读、易写,Markdown被大量使用,如Github、Wikipedia等网站,如各大博客平台:WordPress、Drupal、简书等。

Markdown基础语法

标题

Atx形式(注意#号后面有个空格)

# 一级标题  //对应html中<h1>,以此类推
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题

Setext形式

一级标题
======    //符号个数任意,主要为了美观
二级标题
------

效果如图所示

列表

列表分为无序列表和有序列表
无序列表在每行开头使用*、+、-三种符号表示,可以混用(注意符号后的空格)

+ 列表项1
- 列表项2
* 列表项3

演示效果:

有序列表在每行开头使用数字跟上小数点表示,允许无序的数字(注意符号后的空格)

1. 列表项1
2. 列表项2
3. 列表项3

演示效果:

粗体与斜体

粗体使用**或__包裹

**粗体**
__粗体__

斜体使用*或_包裹

*斜体*

_斜体_

效果如图

块注释

通过在文字开头添加>表示块注释。(在>后添加5个空格后样式会有变化,允许多个>嵌套,最好不要省略>后的空格)

> 普通注释块
>     5个空格的注释块
>> 两个>
>>> 三个>

效果演示:

普通注释块

5个空格的注释块

两个>

三个>

段落与换行

换行有多种写法
第一种,敲两个回车键:

第一段

第二段

第二种,两个空格+回车:

第一段  //此处两个空格
第二段

第三种,使用html中的<br/>标签:

第一段<br/>
第二段

演示效果:

分割线

分割线可以使用三个以上的*、-、_三种符号来创建,由于Markdown支持HTML标签,所以<hr/>也是可以的,行内除空格外不能有其他字符(注意:为与标题中-、=的使用区分开,上一行需为空行)

---
***
___
<hr/>

实际效果:





代码块

代码块分为代码区段和代码区块
代码区段一般用于类似printf()这种在文字段落中插入少量代码的情况,使用`(反引号)将其包裹起来,若代码中包含反引号,可使用多个反引号开启和关闭代码区段。
代码区块一般用于插入一个代码段落,要在 Markdown 中建立代码区块很简单,只要简单地缩进 4 个空格或是 1 个制表符就可以实现。(代码区块第一行的上一行需为空行)

和程序相关的写作或是标签语言原始码通常会有已经排版好的代码区块,通常这些区块我们并不希望它以一般段落文件的方式去排版,而是照原来的样子显示,Markdown 会用 <pre> 和 <code> 标签来把代码区块包起来。 ————Markdown 语法说明 (简体中文版)

`普通代码段`
``带反引号`的代码段``

    代码区块
<pre><code>使用<pre><code>的代码段</code></pre>

演示效果:
普通代码段
带反引号`的代码段

代码区块
使用HTML标签<pre><code>包裹的代码区块

超链接和图片

超链接和图片有两种形式:行内式、参考式。
插入超链接与插入图片的语法很像,区别在一个!号
行内式:

// 插入图片
![图片名称](图片url)

// 插入链接
[显示内容](链接地址)

参考式:

// 插入图片
![图片名称][关联名称]

//插入链接
![显示内容][关联名称]

[关联名称]:url "alt名称"[可省略,亦可写作'alt名称',(alt名称)]

//隐式标记(省略关联名称)
![图片名称][]
[显示内容][]

[图片名称/显示内容]:url "alt名称"[同上]

参考

  1. Markdown 简易入门教程
  2. 5分钟快速入门Markdown
  3. 官方文档
  4. Markdown 语法说明 (简体中文版)
  5. HTML 转义字符

Hello World

Posted on 2018-07-22

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

Johnny Lee

Johnny Lee

5 posts
2 categories
5 tags
GitHub E-Mail
© 2018 Johnny Lee
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4