精华内容
下载资源
问答
  • 用vi删除某一列

    千次阅读 2018-08-06 17:47:28
    vi 中如何一次删除多列?  如:  123aaaaa  !@#aaaaa  ABCaaaaa  +-/aaaaa  在 vi 中如何一次删除前 3 列呢? 最简单的方法: ...具体讲,光标先移动到第一行,第一列,然后按ctrl + v, 然后把...

    vi   中如何一次删除多列? 

    如: 

    123aaaaa 
    !@#aaaaa 
    ABCaaaaa 
    +-/aaaaa 


    在   vi   中如何一次删除前   3   列呢?

    最简单的方法:
    1. 先ctrl-v进行visual   block模式

    2. 移动光标,按列选择你要删除的列

    3. 然后按x命令删除。

    具体讲,光标先移动到第一行,第一列,然后按ctrl   +   v,

    然后把光标移动到第三行,第三列,再按x键。

    就可以删除前三行前三列。

    ——————————

    Ctrl+V, G 之后再右移光标选种几列进行删除x
    如果不用G的话,可以手动自己移动光标进行选择,最后删除

    当然如果用cut和awk也是可以实现的

    比如删除第10列,

    文件有100列

    cut -d ” ” -f 1-9,11-100 urfile

    or:

    awk ‘{$10=”",print}’ urfile

     

     

     

     

    1、vi列删除

    方法一:

    ctrl+v进入列编辑模式;

    将光标定位子想要删除的起始列;

    移动光标至结束列(直接通过移动光标选中,对列不对齐时,可能比较长的行,无法全部选中,尤其是需要一直删除到行末,按end可直接到达,在列不对齐情况下也可将内容全部选择)

    方法二:

    1.定位光标;

    2.按d;

    3.按ctrl+v;

    4.按end(直接到行末)或数字+方向键(指定需删除的字符数)

    注:在第四步,按键后会直接删除选定内容。

     

    2、vi 行删除

    1、单行删除

    单行删除:1(待删除行)d

    光标所在行,dd

     

    2、多行删除

    eg:

    多行删除,删除1到10行

    :1,10d

    从某行开始至文本末尾全部删除,删除第8行至末尾

    :8,$d

     

     

     

    3、查找关键字删除

    1、删除关键字所在行

    要删除文档中含有字符reset_reg的所有行:

    :g/reset_reg/d

    会将含有reset_reg的全部行删除。

    4、删除含有某些字符的行

    :g/string/d

    eg:路径列表,删除含trash的路径

    :g/trash/d

    即可把列表中列出的含有回收站的统计的路径删除。

     

    5、删除空白行

    方法一:

    :g/^$/d

    方法二:

    :%s/^\n/s//g

    方法三:

    :g/^\n/s///g

    方法四:

    删除多行空白行,保留一行空白行

    :%s/^\n$//g

     

     

    6、删除重复行并排序

    输入如下内容:

     

    7、删除全文

     

    输入:

    :g/.*/d

    说明:.*为匹配任意单个字符。

     

    7、部分内容删除方式

    x:删除当前字符。

    dw:删除当前字。

    dd:删除当前行。

    d$:删除当前字符开始到行尾的所有字符。

    d0:删除前一个字符开始到行首的所有字符。

    ndd:删除当前行开始的连续n行。

    dH:删除从当前行到屏幕首行的内容。

    dM:删除从当前行到屏幕中间行的内容。

    dL:删除从当前行到屏幕末行的内容。

     

     

    可视模式让你可以选择文件的一部分内容,以便作比如删除,复制等工作。

    进入可视模式

    v

    用v命令进入可视模式。当光标移动时,就能看到有一些文本被高亮显示了,它们就是被选中的内容。

    三种可视模式

    v

    一个字符一个字符地选。从按下v的那个字符起,一直到光标所移动到的位置之间的内容都被选中。

    V

    一行一行地选。从按下V的那行起,一直到光标所移动到的行之间的所有行都被选中。

    Ctrl-v(可以用来删除一列和多列)

    它选中屏幕上的一个矩形区域。以按下Ctrl-v的位置为一个角,光标所在位置为它的对角。

    离开可视模式

    按下就会离开可视模式。

    可视模式下的编辑

    在可视模式下删除文本

    d

    删除所选中的部分。

    D

    删除所选中部分所在的行。即使没有把一行都选中,也把一行都删除。

    复制

    v

    复制选中的部分。

    D

    复制所选中部分所在行。即使没有把一行都选中,也把一行都复制。

    更改模式

    可以随时在可视模式中的三种之间切换,只需按进入想要切换到的模式的命令即可。

    更改文本

    c

    删除所选中的部分并切换到输入模式。

    C

    删除所选中的部分所在的行并切换到输入模式。

    合并行

    当选中想合并在一起的行以后,按下

    J(大写)

    就可以了。

    程序员的命令

    >

    所选中的部分都缩进一个tab。

    在所选中的部分删除一个tab的缩进。

    =

    自动排列所选中的内容。

    查看man

    K

    命令查看关键字的man page,在可视模式它会以选中的文本为关键字。

    可视块模式

    通过Ctrl-v进入的模式为可视块模式,它会选中一个矩形区域。

    插入内容

    I字符串

    会在每一行所选中内容的开始前添加”字符串”

    改变文本

    c字符串

    会把选中的内空删除并进入输入模式。你只需要在选中的第一行输入一个字符串,当按下后所有行的选中部分都会和第一行一样。这里的字符串中不能包含换行符,如果包含了换行符的话,它就不会这么神奇,就会根普通模式下的c一样了。

    C(大写)

    会直接删除到行尾,其它与c一样。

    A(大写)

    会在选中的块后面添加文本。它们是对齐的。

    如果要在选中的块紧接每行末尾添加内容,则需用$来指定选择到行尾,而不是简单地用光标。

    替换内容

    r

    用来把选中的内容替换成同一个字符。

    缩进

    >

    >将选中的块缩进一个shiftwidth

    留言

    Vim简明教程5:窗口

    九月 3, 2006 @ 9:17 am · 归类于 Vim

    打开一个新窗口

    最简单的打开新窗口的方法是

    :split

    它把一个窗口分成两个,光标留在上面的那个窗口中。

    通过

    Ctrl-w+方向键

    来在窗口间切换

    比如

    Ctrl-ww 或 Ctrl-w Ctrl-w

    切换到下一个窗口;

    Ctrl-wj 和 Ctrl-wk

    分别切换到下一个窗口和上一个窗口。

    要关闭窗口,用

    :q 或 ZZ 或 Ctrl-wc

    找开一个新窗口并在其中打开一个文件

    :split 文件名

    也可以给split命令分配一个初始命令,也就是说执行完split接着要做的

    :split +命令 文件名

    比如

    :split +/printf three.c

    命令会把当前窗口分成两个然后在上面的窗口中查找printf这个字符串。

    控制窗口大小

    如果给split命令指定一个参数,则表示新找开窗口的高度

    比如

    :3split alpha.c

    打开一个高度为3的窗口并在其中打开alpha.c

    :new命令

    :new

    命令用起来就跟split差不多,只有一点不同:new命令会在新窗口中新建一个文件,而split只是在新窗口中打开原窗口中的内容。

    分割并查看(Split and View)

    :sview

    命令新建一个窗口并且其中的内容是只读的。

    改变窗口大小

    行数Ctrl-w+

    把当前窗口高度增加”行数”行(如不指定行数,默认为1)

    行数Ctrl-w-

    把当前窗口高度减少”行数”行(如不指定行数,默认为1)

    Ctrl-w=

    让所有窗口一样高

    行数Ctrl-w_

    把当前窗口的高度设为”行数“,如不指定则把它最大化。

    缓冲

    Vim用缓冲来代表一个文件。当你在编缉一个文件时,只是在编缉它的缓冲。当你完成编辑保存时,Vim把缓冲中的内容保存进文件。当然,事情并不是 这么简单。在Vim中设置的标记之类的也保存在缓冲中。你可以同时拥有多个缓冲,当你编辑多个文件时就是这样。当你想要一个Vim窗口,并且想编辑多个文 件时,把这个窗口最大化是不管用的,因为这不是一个窗口,其它的窗口还是能看得见的。此时你可以把不编辑的缓冲隐藏(hide),用命令

    :hide

    一个缓冲有三种可能的状态:

    活动:显示在屏幕上的窗口

    隐藏:没有显示在屏幕上的在编辑的缓冲

    不活动:缓冲没有在编辑,但是保存着它的信息

    第三种状态需要多解释一下,当你编辑另一个文件时,当前文件的内容就没有用了。Vim就关掉它。但是它的一些其它信息可能还有用。(这一部分比较混乱,原文说得也不是很清楚,不懂也无所谓)

    要查看缓冲的列表,用

    :buffers

    命令。输出的第一列是缓冲编号,第二列是状态,第三列是与缓冲对应的文件。

    状态共且以下几种:

    - 不活动的缓冲
    h 隐藏的缓冲
    % 当前缓冲
    # 其它缓冲
    + 文件被编辑而未保存

    选择一个缓冲

    :buffer 缓冲编号

    如果你不知道缓冲的编号,可以用

    :buffer 文件名

    下面的命令分割窗品并编辑指定的缓冲

    :sbuffer 缓冲编号

    :sbuffer 文件名

    还有很多关于缓冲的命令:

    :bnext 去下一个缓冲
    :count bnext 执行count次去下一个缓冲
    :count sbnext 先分割窗口,然后执行:count bnext
    :count bprevious 去上一个缓冲。如果指定了count,则执行count次
    :count sbprevious 先分割窗口,然后执行:count bprevious
    :count bNext 同:count bprevious
    :count sbNext 同:count sbprevious
    :blast 去最后一个缓冲
    :sblast 先分割窗口再执行:blast
    :brewind 去第一个窗口
    :sbrewind 先分割窗口再执行:brewind
    :bmodified count 去第count个编辑过的缓冲
    :sbmodified count 等于:split加:bmodified

    缓冲选项

    通常当所有编辑一个文件的窗口都关掉后,这个窗口的缓冲就变成”不活动”,如果不想这样,可以设置

    :set hidden

    让它变成隐藏而不是不活动。

    通常分割/缓冲相关的命令会分割当前窗口,但是也可以让Vim在已经有窗口打开所指定的缓冲时,切换到那个窗口而不是新建一个:

    :set switchbuf=useopen

    更多关于switchbuf的内容参见23章。

    留言

    Vim简明教程4:块和多文件编辑

    九月 1, 2006 @ 11:04 am · 归类于 Vim

    这是我在看一本叫做Vim Tutorial的书时作的笔记,去掉了例子,作了一下总结。放上来作为一个Vim的小教程分享一下。本系列文章可转载,但请注明出处:http://mingfal.bloggerspaces.com

    剪切,粘贴和复制

    当你在删除文字的时候,比如d, x之类的,被删除的内容都被保存了下来。你可以通过

    p

    来粘贴它们。

    交换字符
    有时你会把两个字母打反,比如把the打成teh。用

    xp

    命令就可以把它们调换位置。原理是这样的,首先x会把e删除并保存,p会把它粘贴到光标所在位置,也就是h之后。

    关于粘贴的更多
    p命令可以用多次。p命令把内容粘贴在光标之后,而

    P

    把内容粘贴在光标之前。

    标记

    Vim允许你在文本中做标记。命令

    ma

    会在光标所在处做一个名为a的标记。你最多可以在文本中做26个标记(a-z)。

    要移动到一个标记,用命令

    `标记

    其中`是在键盘左上角数字一左边的那个键

    要移动到一个标记所在行的行首,用命令

    ‘标记

    其中‘是单引号

    标记在删除大量文件内容人时很有用。比如

    在你想要删除的文本的开始处做标记ma

    然后移动到想删除文本的末尾,用d`a删除从此位置到标记a间的内容。

    注意,标记会跟着它所标记处的文本移动(比如在它之前插入或删除了东西)

    标记都在哪呢?

    :marks

    命令会列出所有标记的列表。

    复制

    y

    命令用来复制,它的用法与d很相似。

    复制一行

    Y(大写)

    复制一行内容

    管道

    !动作 命令

    会把由”动作”选中的文本作为”命令”的输入,并用”命令”的输出替换选中的文本。

    举个例子,sort命令会对一个文件的内容排序。如果想对当前正在编辑文件的前10行排序,可以这样:

    先把光标移动到第一行,然后

    !10G sort

    !!命令

    命令把当前行作为“命令”的输入。(这是一个把系统命令的输出放到文件里的好方法)。

    编辑另一个文件

    :vi 或 :e

    可以关闭当前文件,并打开新的文件。

    如果当前文件没有保存,则会出现提示。这时使用

    :w

    会保存未保存的文件。

    View命令

    :view 文件

    会在Vim中以只读方式打开文件。

    处理多个文件

    可以在调用Vim时指定多个参数以依次编辑多个文件

    Vim 文件1 文件2 文件3 …

    默认情况下Vim每次只会编辑一个文件,当编辑完一个文件时,

    :next

    命令会关闭光前文件打开下个文件开始编辑。

    我在哪里
    当你在编辑多个文件时有时会忘了自己在编辑哪个。

    :args

    命令会显示当前正在编辑哪个文件。

    编辑上一个文件

    当要编辑上一个文件时,用命令

    :previous 或 :Next。

    编辑每一个或最后一个文件

    要编辑第一个文件,用

    :rewind

    要编辑最后一个文件,用

    :last

    编辑两个文件

    当同时编辑两个文件时,正在编辑的是当前文件,没在编辑的会被当成“另一个文件”,在这两个文件间切换要方便的多。用命令:

    Ctrl+^

    留言

    Vim简明教程3:查找

    九月 1, 2006 @ 10:55 am · 归类于 Vim

    这是我在看一本叫做Vim Tutorial的书时作的笔记,去掉了例子,作了一下总结。放上来作为一个Vim的小教程分享一下。本系列文章可转载,但请注明出处:http://mingfal.bloggerspaces.com

    简单查找

    /要查找内容

    用/向后查找,紧随其后的要查找的内容。然后按下回车,Vim就会去为你找你想要的东西了。

    要注意

    .*%/\?!$ 还有空格

    都有特殊意义,如果要查找的内容中包含这些字符,要在前面加上一个\。

    要查找区配的下一处,用命令

    \ 或 n

    它们的作用是相同的。

    查找历史

    查找命令可以允许你来查看查找的历史,在输入一个/以后,不要按回车,然后再按上下键就可以查看上一条或下一条查工历史了。在某个历史处如果按回车,就会查找此内容。

    查找选项

    高亮

    :set hlsearch

    命令可以让所有的查找都高亮显示匹配的部分。

    :set nohlsearch

    取消高亮选项

    增量查找

    一般情况下,Vim在查找时要等待用户输入整个要查找的内容,然后再去查找。增量查找则是不等用户输入完毕,就查找已输入的部分。要使用它需要进行下面设置:

    :set incsearch

    如查取消,则

    :set noincsearch

    反向查找

    ?要查找的内容

    命令从当前位置开始反向查找,即向文件的开始查找。

    改变方向

    N

    命令可以改变查找的方向并查找改变方向后的下一处匹配。

    基本的正则表达式

    行首(^)和行尾($)

    ^表示一行的开始,include会匹配每一处的include,而^include只会匹配在行首的include。
    $表示一行的结束,was$只会匹配在行末的was。
    如果想要匹配只有一个词the的行,用^the$。

    匹配任意单个字符(.)

    .匹配任一个字符,比如c.m表示以c开头以m结尾的有三个字母的字符串。

    匹配特殊字符

    好多字符在正则表达式中有特殊含意。要匹配这一类字符,要在前面加一个\。比如,要匹配the.,就要用the\.

    留言

    Vim简明教程2:编辑得更快一些

    八月 30, 2006 @ 12:43 pm · 归类于 Vim

    这是我在看一本叫做Vim Tutorial的书时作的笔记,去掉了例子,作了一下总结。放上来作为一个Vim的小教程分享一下。本系列文章可转载,但请注明出处:http://mingfal.bloggerspaces.com

    按词移动

    w

    按下w会前进一个词。

    b

    按下b会后退一个词。

    这里,就像在Vim中的大部分情况下一样,在这两个命令前面加上一个数字可以让它们重复做多次。

    移动到行首或行末

    $

    $会让你移动到所在行的末尾。

    ^

    ^会让你移动到所在行的开始。也可以做相似的事。不过^会移动到第一个非空的字符处,而会移动到行首。

    这两个命令也接受数字参数,比如

    2$

    会移动到下一行末。

    在行上查找

    f要查找的字符

    f用来在一行上查找一个字符并移动到该字符所在处。比如

    fx

    用来移动到此行当标后第一个x处。如果有一个数字参数,就可以指定移动到某个指定的匹配位置。

    F

    F用来向左查找。

    移动到指定行

    行号G

    G命令会把你带到用行号指定的行。如果使用没有行号的G,将会移动到最后一行。

    显示当前所在位置

    :set number

    Vim的可制定性是很强的,所以你可以通过:set设定很多选项。number就是其中之一。它是一个布尔选项,用来控制是否在最左边显示行号。

    :set number

    可以把它打开。

    :set nonumber

    则可以关闭此选项。

    Ctrl+g

    Ctrl+g会显示当然后在的位置。

    向上和向下翻屏

    Ctrl+u

    会向上翻半屏

    Ctrl+d

    会向下翻半屏

    删除文本

    dw

    dw会删除一个词。你应该可以看得出来,这里的w代表的就是word(词).其实d后面可以加好多东西来控制删除的对象。比如:

    d$

    会删除从当前位置到行末的所有内容。

    数字放在哪

    这里有一个疑问,如果想删除三个词,那么应该怎么办?是d3w,还是3dw。其实它们都能做到,不过原理不太一样。d3w是一次删除三个词,而3dw是执行三次删除一个词。其实这两者可以混起来,比如2d3w。

    改变文本

    c

    c用来改变文本。它的用法跟d一样。

    cc

    用来删除一行并进入输入状态。

    cw

    用来删除一个词并进入输入状态等。

    但是cw跟dw有一个不同之处。dw删除了一个词以后,还删除该词后面的空格。而cw只是会删除这个单词,空格仍然保留。

    .

    .命令会重复上一次所做的删除(d, x)或改变(c)命令。

    合并行

    J

    J(大写)将当下一行接在当前行后,并在两者间插入一个空格来合并这两行。

    替换字符

    r替换的字符

    r命令把当标处的字符替换成在r命令中指定的字符。

    更改大小写

    ~

    通过~可以把光标处的字符用它的大写(如果现在是小写)或小写(如果现在是大写)替换。

    Vim有着简洁而强大的宏功能。

    q宏名

    按下 q+宏名 后会进入宏录制状态,也就是说,此后发生的一切操作都会记录到名为“宏名”的宏中。如果名为“宏名”的宏已经存在,则将它覆盖。

    @宏名

    会调用名为“宏名”的宏。

    特殊字符

    当要输入特殊字符时,可以用

    Ctrl+k特殊字符代号

    可以通过命令

    :digraph

    来得到一个完整的对应表,来查看特殊符号所对应的代号。

    比如,要输入á, 则要通过下面的方法

    Ctrl+ka’

    留言

    Vim简明教程1:基本编辑

    八月 30, 2006 @ 12:37 pm · 归类于 Vim

    这是我在看一本叫做Vim Tutorial的书时作的笔记,去掉了例子,作了一下总结。放上来作为一个Vim的小教程分享一下。本系列文章可转载,但请注明出处:http://mingfal.bloggerspaces.com

    开始之前要做的

    touch ~/.Vimrc

    这会创建空的~/.Vimrc文件,这会告诉Vim你想要让Vim以Vim方式工作。如果不这样做的话,Vim会以Vi兼空模式运行,会有好多有用的功能没法使用。这也可以在Vim运行过程中通过

    :set nocompatible

    来实现。

    第一运行Vim

    gVim file.txt

    会运行gvim(Vim的图行化前端),并在其中打开file.txt文件

    Vim命令

    Vim

    会让你在终端打开Vim编辑,而不是像刚才那样打开一个新的窗口。

    模式

    Vim是一个模式化的编辑器。也就是说,它在不同的模式下会有不同的表现。当最下面的一行是文件名或为空时表示正在普通模式。如果是–INSERT–表示是在编辑模式。而–VISUAL–则表示目前是可视化模式。

    插入文本

    i

    键入i后会从普通模式转变到编辑模式。此时输入的东西将会作为文件的一部分。

    当你编辑完毕后,按下就会从编辑模式转回普通模式。同时,不管现在是在什么模式下,都会把你带回普通模式。

    移动光标

    当你回到命令模式(即普通模式)时,可以用下面的键来移动光标

    h(左), j(下), k(上), l(右)

    这可能看上去比较奇怪,谁会用l去表示右???但是实际上这是有原因的。移动光标上是在编辑过程中经常要做的,而h , j, k, l就在放右手手指的地方,也就是说按这几个键是最快的。当然,也可以用方向键来移动光标,不过那会大大减低你的编辑速度。

    删除字符

    x

    当你想删除一个字符时,把光标移动到它上面,然后按下x键,它就会消失。

    撤消和重做

    u

    在普通模式下按下u会撤消上一布的操作。

    Ctrl+R

    如果撤消的次数过多,按下 Ctrl+R 会重做上次撤消的操作。

    U

    U(大字)是一个特殊的撤消键,它会撤消在在最后编辑的行上所作的所有操作。

    退出

    ZZ

    ZZ会退出Vim并对所编辑的文件保存。

    取消修改

    :q!

    当你编辑完一个文件发现你并不想这样编辑它时,:q! 会让你退出Vim而不保存所作的修改。

    追加

    a

    i会在光标所在安符前插入字符,而a会让你在当标所在的位置之后继续输入内容。

    删除一行

    dd

    dd命令会删除当前所在的一行内容。

    新开始一行内容

    o

    o命令会在光标所在行下面加入一行,并将光标移动的此行的开始以供输入。

    O

    如果想在光标所在行的上面加入一行,请使用命令O(大写)

    获得帮助

    :help

    :help命令让你可以进入和查看Vim的帮助。用ZZ退出帮助。同时可以用像在Vim一样的h, j, k, l键来移动光标。帮助中会有一些被竖线括起来的词,那其实是超级链接。用Ctrl+]就可以跟随它,Ctrl+t用来后退。如果要查找某一特定主题的帮助,使用

    :help 主题

    同时

    也会起到和:help一样的效果。

    重复命令

    当要做多次同样的操作时,可以用计数来加快这一过程。

    9k

    会让你向上移动9行。通过在命令前加一个数字n,就可以执行这一命令n次。

    Vim教程

    Vim自带了一份Vim教程

    :vimtutor

    会打开它。

     

    展开全文
  • ![图片说明]...如图,能不能统计出如下结果 ![图片说明](https://img-ask.csdn.net/upload/201608/23/1471918335_524533.png) 共有24,比较多,求问下有没有什么方便且效率高的方式 (每月300w条数据)
  • 这道题目实际上很有意思,因为如果给出这样的系列的数字1,2,3,4,就是各个数字都不一样,这样的排列就很好出了,我们可以逐个遍历,我们可以从简单的算起,首先我们出具有不同的字符序列的所有排列: ...

    今天看书,看到了一道题目,就是:

    给定一系列数字,例如1,2,2,3,4,请列出这系列数字的所有排列。


    这道题目实际上很有意思,因为如果给出这样的一系列的数字1,2,3,4,就是各个数字都不一样,这样的排列就很好列出了,我们可以逐个遍历,我们可以从简单的算起,首先我们列出具有不同的字符序列的所有排列

    1、开始的时候,是这样1234,先将1固定住,则后面的234在代入进去,称为一个新的字符串参加递归,则得到的就是以1开头的所有排列的字符串

    2、同样的234,现将2固定住,则后面的34作为一个新的字符串参加递归,则得到以12开头的所有排列的字符串1234    1243

    3、对于34,将3固定住,则只有34一种排列。

    上面的以1 为前缀的知识排列的一种,接下来

    4、如下面的程序我们可以看出    body = body.substring(1) + body.substring(0, 1);

    则是将1234编程2341,重新进行递归,则此时就是将2作为前缀继续递归,则能求出以2 为前缀的所有排列

    5、下面分别对3    4 作为前缀继续递归,则能求出所有的排列。

    因为递归的此数就是body字符串的长度,所以我们刚好可以将所有的字符串放在首位作为前缀递归。

    下面是具有不同的字符序列的所有排列的源代码:

    package programmer;
    
    public class PreKinds {
    	public static int count = 0;
    
    	public void preKinds(String body, String prefix) {
    		if (body.length() < 1) {
    			System.out.println(prefix);
    			count++;
    		} else {
    			// int[] index = new int[body.length()];
    			// for (int i = 0; i < body.length(); i++)
    			// index[i] = body.indexOf(body.charAt(i));
    			for (int i = 0; i < body.length(); i++) {
    				// if (i == index[i])
    				preKinds(body.substring(1), prefix + body.substring(0, 1));   //这儿就是实现将前缀先固定住的方法
    				body = body.substring(1) + body.substring(0, 1);//这儿可以实现将2、3、4分别放在最前面作为前缀的一部分
    			}
    		}
    	}
    
    	public static void main(String[] args) {
    		String body = "1234";
    		new PreKinds().preKinds(body, "");
    		System.out.println(count);
    	}
    }
    



    通过上面的讲解,我们已经明白了具有不同的字符序列的所有排列,但是我们现在所要求的是中间可能还有相同的字符,这个题目很巧妙,因为它要关注字符本身,是1,2,2,3,4,我们发现,要排列的字符总是顺序的,即是有序的,这就让我想到我们如果要使具有相同字符序列的排列只可以有一次递归,千万不能出现两次递归,我们可以用一个数组来标记相同字符出现的最初位置,就可以方便判断了。

    下面是具有相同的字符序列的所有排列的源代码:

    package programmer;
    
    public class PreKinds {
    	public static int count = 0;
    
    	public void preKinds(String body, String prefix) {
    		if (body.length() < 1) {
    			System.out.println(prefix);
    			count++;
    		} else {
    			int[] index = new int[body.length()];
    			for (int i = 0; i < body.length(); i++)
    				index[i] = body.indexOf(body.charAt(i));  //这里将每个字符第一次出现的位置放在index数组中
    			for (int i = 0; i < body.length(); i++) {
    				if (i == index[i])   //判断,如果有相同的字符,则index[i]与i一定不相等
    					preKinds(body.substring(1), prefix + body.substring(0, 1));
    				body = body.substring(1) + body.substring(0, 1);
    			}
    		}
    	}
    
    	public static void main(String[] args) {
    		String body = "12234";
    		new PreKinds().preKinds(body, "");
    		System.out.println(count);
    	}
    }
    


    希望大家多多指正。

    展开全文
  • 这几天做项目,需要做表格,将第一列固定动,其他的超出的内容可以滚动,网上查了很多办法,刚开始写的是第一列一个表格,其他内容一个表格。给其他内容设置滚动条。(内容随着后台一直添加,长短不一) 遇到的...

    这几天做项目,需要做表格,将第一列固定不动,其他的超出的内容可以滚动,网上查了很多办法,刚开始写的是第一列一个表格,其他内容一个表格。给其他内容设置滚动条。(内容随着后台一直添加,长短不一)

    遇到的问题:

    1、每行的内容不一样,让每个td的宽度不一样,出来的表格看起来很乱。

    解决办法:给table设置 display:flex,   tr td { flex: 1}。

    随之而来的问题:多出的内容不显示,那就设置它 自动换行    中文换行是   white-space:pre-wrap;

    2、由上面的方法出现的问题第一列的高度没有内容撑高,高度不一致。

    3、网上查了一个方法,接下来用了两个一摸一样的表格,把一个绝对定位到另一个的上面,把除了第一列的其他内容隐藏,用了visibility:hidden,给第二个表格设置滚动,可是因为visibility:hidden占位置,第一个表格盖住了第二个,不能拖动,用display:hidden不占位置,但是内容就又撑不高了。

    解决办法:

    1、第一个表格绝对定位到第二个表格上,但是外面嵌套的盒子宽度设为第一列的宽度。

    2、给第二个表格设置滚动条就可以。

    <style>
        table, td, th{
            border:1px solid #ccc;
        }
        table {
            border-collapse: collapse;
            text-align: center;
        }
        table tr:nth-child(even) {
            background:rgba(245,245,245,1);
        }
        th {
            height: 35px;
            background:linear-gradient(0deg,rgba(196,156,90,1) 0%,rgba(226,196,138,1) 100%);
            color: #fff;
        }
        
        tr {
            display: flex;
        }
        tr td, tr th {
            flex: 1;
        }
        td {
             white-space:pre-wrap;
        }
        .table-box {  
            width: 360px;    
            margin-top: 20px;
            position: relative;
            /* overflow: scroll; */
        }
        .tab-clo {
            width: 82px;
            border-right: 2px solid #ccc;
            margin-left: 9px;
            position: absolute;
            top: 0px;
            left: 0;
            overflow: hidden;
            background: white;
        }
        .tab-clo td:not(:first-child),
        .tab-clo th:not(:first-child){
            visibility: hidden;
            /* display: none; */
            background: white;
        }

        table {
            width: 500px;
        }
        .tab-clo {
            overflow: hidden;
        }
        .tab-other {
            margin-left: 9px;
            overflow: hidden;
            overflow-x: scroll; 
            /* 内容会被裁剪,会以滚动条显示 */ 
            overflow-y: hidden;  /* 超出内容不可见 */    
        }

    </style>

     

    <view class="table-box">
                <view class="tab-clo">
                    <table class="tab-first">
                        <tr>
                            <th>名字</th>
                            <th>类型</th>
                            <th>标题</th>
                            <th>内容</th>
                            <th>创建日期</th>
                            <th>提交日期</th>
                        </tr>
                        <tr v-for="(work,index) in workList" :key="index">   /*数据从后台来,所以用循环*/
                            <td>{{work.brokername}}</td>
                            <td>{{work.tasktypename}}</td>
                            <td>{{work.caption}}</td>
                            <td>{{work.content}}</td>
                            <td>{{work.createdate}}</td>
                            <td>{{work.startdate}}</td>
                            <!-- <td>{{work.creator}}</td> -->
                        </tr>
                    </table>
                </view>
                <view class="tab-other">
                    <table class="tab">
                        <tr>
                            <th>名字</th>
                            <th>类型</th>
                            <th>标题</th>
                            <th>内容</th>
                            <th>创建日期</th>
                            <th>提交日期</th>
                        </tr>
                        <tr v-for="(work,index) in workList" :key="index">
                            <td>{{work.brokername}}</td>
                            <td>{{work.tasktypename}}</td>
                            <td>{{work.caption}}</td>
                            <td>{{work.content}}</td>
                            <td>{{work.createdate}}</td>
                            <td>{{work.startdate}}</td>
                            <!-- <td>{{work.creator}}</td> -->
                        </tr>
                    </table>
                </view>
            </view>

    展开全文
  • 如 173 + 286 = 459 且 将 286 + 173 = 459 视为同种,问满足这样条件的情况有几种 问题解法: 将9个重复数字填入到9个位置并且满足等式成立条件,可以看做求9个数组的全排列,只要全排列满足 前3个数字 + 中间3...

    问题描述:
    将1-9的9个数字不重复的填入[ ][ ][ ] + [ ][ ][ ] = [ ][ ][ ],使得等式成立
    如 173 + 286 = 459 且 将 286 + 173 = 459 视为同一种,问满足这样条件的情况有几种

    问题解法:
    将9个不重复数字填入到9个位置并且满足等式成立条件,可以看做求9个数组的全排列,只要全排列满足 前3个数字 + 中间3个数字 = 最后3个数字即可;
    为简化问题,我们先看123这三个数字的全排列,很简单,123这三个数字的全排列是
    123 ;132 ; 213 ; 231; 312 ; 321
    我是这么做的,假设将1 2 3 这三个数放到 3 个盒子中,那么所有可能数即为全排列数,我们约定 每一次往盒子里面放数的时候,都从小到大放, 比如第一个盒子,我们放1;第二个盒子因为1已经没了,所以我们放2;第三个盒子我们只能放3了;现在全部放完。但显然全排列情况不止这一种,所以我们将第三个盒子中的3取出,但取出3后还是只能放3,与刚刚的情况重复,所以我们将第二个盒子中的2也取出来,此时我们手里面有2 3 ;向第二个盒子里面放数,因为放2这种情况已经出现过,所以我们放3,第三个盒子只能放2,得出的全排列为 132;然后继续弹出,将1 2 3 这三个数均弹出,现在我们往第一个盒子里面放2(由小到大放),第二个盒子里面放1,第三个盒子里面放3,得出全排列为 213 ;…
    依次类推,直到第一个盒子里面准备放4为止;(不可能放4,因为我们手里面只有3个数)
    现在我们将上述过程图形化表示出来;是这样的:

    在这里插入图片描述
    发现了什么?发现了每一次搜索但是从第一层到最后一层,先纵向搜索,然后再横向搜索,而这正是深度优先搜索的核心思想

    当我们解决了第一个盒子的放那个数据的问题后,需要解决第二个盒子的放数据问题,而解决第二个盒子的存放数据问题和解决第一个盒子的存放数据问题的步骤是完全一致的;所以核心是如何解决第一个盒子的存放数据问题;
    因为每一次放数据都不能重复,所以我们需要知道哪些数据已经被放入盒子里,哪些没有;因为数字1 2 3 ,所以我们用一个数组来标记book[4] = {0}; 0 号元素弃之不用(方便编程);book[1] ==0表示1还未被使用,当1已经被使用后 置book[1] = 1,
    解决了哪些元素还可以用的问题,接下来就是解决程序何时停止的问题;当我们准备往第四个盒子里面放数据时,说明前3个盒子里面已经有数据,程序应该停止

    知道了如何进行 1 2 3 三个数字的全排列,1- 9的全排列也是类似的;废话不多说,直接上代码

    C++实现代码如下:

    #include "iostream"
    using namespace std;
    #include "vector"
    //问题描述,ABC + EFG = HIJ,其中A...J对应1-9中的某个数,使得等号成立,求出可能的情况
    //EFG + ABC = HIJ和上面的算是一种情况
    
    //这一问题可以用暴力枚举循环,因为某个数被用过之后就不能在被别的地方用,所以需要用桶标记法来标记该数是否被用过
    //但这就需要嵌套10层循环,然后如果如果用到了某个数,则将桶置为1,最后看所以桶之和是否为9,为9说明每个数都被用了一次
    
    //但你是否觉得过于复杂,所以我们引入了 深度优先搜索算法,该算法的 基本思路是:重点是解决当前的问题,然后解决下一个问题的步骤与解决该问题的步骤一致
    
    /*
    简单模型
    
    判断边界,不满足边界条件,则跳出深度优先搜索
    尝试每一种可能(for循环)
    {
    	继续下一步
    }
    返回
    
    
    */
    
    //解题思路:将9个空格看做待填入数的9个空格,每次填入一个,直到填满,判断是否符合条件,符合条件则+1,则推到上一个格子处重新填数
    
    
    void DFS(int step,vector<int> & v1, vector<int> & v2,int &count)//v1表示每一步填入的数;v2为标记,相当于上面的book
    {
    	//边界条件
    	//因为是9个数,从1开始,所以如果step > 9准备往第10个盒子里放数据;说明此轮搜索完毕,前9个盒子里面有数据,判断是否符合  相加和相等条件;如何跳出(边界条件,控制递归结束)
    	if (step > 9)
    	{
    		if (v1[1] * 100 + v1[2] * 10 + v1[3] + v1[4] * 100 + v1[5] * 10 + v1[6] == v1[7] * 100 + v1[8] * 10 + v1[9])
    		{
    			count++;
    
    			printf("%d%d%d+%d%d%d = %d%d%d\n", v1[1], v1[2], v1[3], v1[4], v1[5], v1[6], v1[7], v1[8], v1[9]);
    		}
    		return;
    	}
    	//开始解决第一步填入的数
    	for (int i = 1;i <= 9;i++)
    	{
    		if (v2[i] == 0)
    		{
    			v1[step] = i;//将i填入第一步step中,然后置其标记为1
    			v2[i] = 1;//表明i已经被用了,不能再用了
    			//然后开始第二步
    			DFS(step + 1, v1, v2, count);
    			//释放已经用过的数,否则下次循环不能用
    			v2[i] = 0;
    		}
    	}
    	return;
    }
    
    
    
    int main()
    {
    	vector<int> v1(10,INT_MAX);
    	vector<int> v2(10, 0);
    	int count = 0;
    	DFS(1,v1,v2,count);
    	cout << "满足相加和相等条件的情况有"<<count / 2 << endl; //因为173 + 286 = 459 与 286 + 173 = 459为同一种
    	system("pause");
    	return 0;
    }
    

    程序运行部分结果
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 在基于数据库的系统的开发过程中,有时需要让select返回的查询结果中存在一列实际的数据库表中并存在的序号列,即在查询结果中额外增加自增的伪序号列。从网络上可以找到一些解决方案,但总结起来主要有三种: 1
  • 在利用birt报表制作table表格时,我们经常会遇到所要制作的表格列数不固定的情况,比如第一列是科目名,后面的列是各个学生的情况(当然实际中一般都是第一列为学生,后面每列是科目,这里只是举个例子),而birt的...
  • 工作原因接触到python对Excel表的操作,在这总结一下。首先需要pip install xlrd,pip install openpyxl将两个模块进行安装。...# 参数为(excel表的绝对地址,需要查找数据的表名,想要数据的列数,表头行数) def ...
  • 题目要求:将1~9这9个数字分成三组,每组中的三个排成个三位的完全平方,要求每个数字必须且只能用次 。 思路如下: 1、先造个数组num[]用来标记1到9这几个数字是否已经被使用过。比如:num[1] = 0,表示&...
  • 1、8*8的棋盘上面放着64个不同价值的礼物,每个小的棋盘上面放置个礼物(礼物的价值大于0),个人初始位置在棋盘的左上角,每次他只能向下或向右移动一步,并拿走对应棋盘上的礼物,结束位置在棋盘的右下角,请...
  • 最近产品来了个需求,需要做个流程图,在流程图上点击文字时需要弹窗显示数据,因此渣渣个需求里做了n个弹窗,弹窗上再弹窗。。。。。(心里无数XXX奔过),因此也遇到了不少的问题,流程图是个大模...
  • 项目中使用POI导出Excel的一些心得(包含复杂表头和动态页数与列数)最近使用poi做Excel导出较多,应用场景也各种各样,导致基本都是按需求自己手动拼的Excel,网上的通用工具类大多适合业务需要,简单记录下来...
  • 在 SQL 数据库中,生成(Generated Column)是指由表中其他字段计算得到的,因此也称为计算(Computed Column)。 本文介绍各种主流数据库对于生成/计算的实现,包括 Oracle、MySQL、SQL Server、...
  • 参考: ... 先来看比较简单的情况,比如维数组 冒号的用法 ...j是终止位置,默认为len(a),在取出数组中的值时就会从数组下标i(包括),一直取到下标j(包括j) a=[0,1,2,3,4,5,6] print(a[1:5]...
  • linux下如何统计个目录下的文件个以及代码总行的命令 知道指定后缀名的文件总个命令:  find . -name "*.cpp" | wc -l  知道个目录下代码总行以及单个文件行数:  find . -name "*.h" | xargs ...
  • 用Excel也实现和Python数据分析一样的功能! 这是篇关于如何用excel做数据分析的案例。目的是帮助大家,在遇到小型数据样本时,快速利用excel做分析。所以本篇文章的重点是分析思路+数据处理+可视化的实现,...
  • ArcGIS系列():DEM数字高程模型数据的生成

    万次阅读 多人点赞 2018-11-10 10:53:03
    、引 DEM的全称是Digital Elevation Model,非常直接的翻译,就是“数字”、“高程”、“模型”三个词的直接拼接,可谓是简单粗暴好理解,DEM不只是用高程...有童鞋可能要问TIN文件又是什么鬼,为什么不能直接生...
  • 数据挖掘中所需的概率论与数理统计知识

    万次阅读 多人点赞 2012-12-17 19:24:47
    导言:本文从微积分相关概念,梳理到概率论与数理统计中的相关知识,但本文之压轴戏在本文第4节(彻底颠覆以前读书时大学课本灌输给你的观念,探正态分布之神秘芳踪,知晓其前后发明历史由来),相信,每个学过...
  • 为了研究131072到底能不能达到,我意识到只能悔一步的版本无法满足我的要求,于是我开始玩第三种版本——无限悔棋版(下面是我的成绩) APK下载 https://blog.csdn.net/nameofcsdn/article/details/119086279 其实...
  • SQL属性

    千次阅读 2016-08-22 23:01:20
    属性: 真正的约束字段的是数据类型,但是数据类型的约束很单一,需要有一些额外的约束,来...虽然数据库基本都是字段为空,但是开发的时候,尽量保证所有的数据都应该为空,空数据没有意义,空数据也没有办法参
  • 0、前言 当年博主自己参加校招笔试面试时就遇到过几次catalan相关的题目,今年又到了互联网招聘季,翻看下近期各大公司的笔试面试题,发现...不管怎么说,它是笔试面试中容易出现的东西,而有部分同学可能不大熟悉
  • 我们在学习二叉树的遍历时,都会不可避免的学到二叉树...但是我们在进行逆向操作的时候却会遇到困难:我们并不能从某种遍历方式推断出唯一的二叉树,也就是说,这是个单向编码的过程。而当我们有个二叉树的两种遍历
  • 引Catalan,中文卡特兰又称卡塔兰,是组合数学中个常出现在各种计数问题中的数列。一旦入坑,你会发现这个数列相当有意思,能够应用于很多看起来特别复杂的计算场景,当然,并将之迎刃而解。 wikipedia...
  • 使用vlookup匹配时出现 /N#A 怎么办

    万次阅读 2019-01-09 12:23:56
    在使用vlookup函数时,时而会...分析:如果查找的值为数字,并且返回错误值时,多数情况是查找值和原始数据表值的格式不一样 解决方法 1)利用【分列】功能将A的文本型数字转化为数字; ----------------------...
  • oracle 中的伪和表

    千次阅读 2012-04-11 12:45:08
    oracle系统为了实现完整的关系数据库功能,系统专门提供了组称为伪(Pseudocolumn)的数据库,这些不是在建立对象时由我们完成的,而是在我们建立时由Oracle完成的。Oracle目前常见的伪:  currval 和...
  • table设置宽度

    万次阅读 2017-02-22 21:18:12
    遇到个表格不能设置宽度(table有宽度,有需要设固定大小的宽度并希望看到展现出来的宽度值与设定的一样,其他的则可以根据剩余宽度自动填充,但是显示出来的宽度比实际设置的值多了几个像素)这个问题,...
  • 类型(数据类型)所谓的类型,其实就是指数据类型,即对数据进行统一的分类,从系统的角度出发是为了能够使用统一的方式进行管理,更好的利用有限的空间。在 SQL 中,将数据类型分成了三大类,分别为:数值型、...
  • Catalan 计算及应用

    万次阅读 2014-08-21 22:50:59
     catalan(卡塔兰)取自组合数学中个常在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。 卡塔兰的一般项公式为  令其为h(n)的话,满足h(n)= h(0)*h(n-1)+h...
  • 计算一列中某个值的个数

    万次阅读 2019-04-15 22:14:54
    这两天在参加阿里大数据竞赛,进入第二赛季要用到不少的SQL语句,现在才发现当时的数据库是白学了,今天就根据具体的需求来整理一下。可以把需求整理成为一道...给定个表t_alibaba_data: user_id brand_id t...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 356,215
精华内容 142,486
关键字:

一列不能出现一样的数