有一个数组,可以包含,例如,最多1000元素.它可以产生的数字范围1 to 10^10.现在我必须minimal absolute difference在数组中找到两个数字之间的数字.我想到了两种算法:
对于第一个,我已经定义了一个binarysearch函数,该函数在排序的数组中找到要插入的数字的位置.现在,我只使用给定数组的第一个数字启动排序数组,然后从第二个元素开始迭代给定数组.对于每个数字,我在排序数组中找到它的位置.如果该位置的数字是这个数字,那么差值为0,它是最低的数字,所以我退出循环.否则,我在该点插入已排序数组中的数字,然后检查该数字与该数组中前一个和下一个数字之间的差异.然后我存储此结果的最小值和先前的结果,并以这种方式继续.
第二:我使用quicksort对数组进行排序.(范围太大,所以我认为基数排序不会那么高效).然后我迭代它,如果两个连续的数字相等则以0的答案断开,否则存储该数字与前一个数字和前一个结果之间的差值的最小值.
哪一个会更有效率?
还有更好的算法吗?
Stackoverflow在这方面有很多帖子,但它们没有多大帮助.这是我在Perl中的代码:
sub position {
my @list = @{$_[0]};
my $target = $_[1];
my ($low,$high) = (0, (scalar @list)-1);
while ($low <= $high) {
$mid = int(($high + $low)/2);
if ( $list[$mid] == $target ) {
return $mid;
}
elsif ( $target < $list[$mid] ) {
$high = $mid - 1;
}
else {
$low = $mid + 1;
}
}
$low; …Run Code Online (Sandbox Code Playgroud) 我试图理解变量范围并在Perl中正确声明变量,我很难过.
下面的代码基本上读取一个excel文件,解析它,然后将它吐出到一个新的excel文件中.
但是,我试图读取其中一个标题,如果标题与我的字符串匹配,我想记录该列号,并在稍后的代码中使用它.
我在./parser.pl第38行打印出"使用未初始化的值$ site_name_col".
第38行是"print $ site_name_col;"
我意识到这个print语句在最初初始化变量的{}之外,但它在代码的开头被声明为一个全局变量,那么是什么给出了?
#!/usr/bin/perl -w
use strict;
use warnings;
use vars qw($site_name_col);
use Spreadsheet::WriteExcel;
use Spreadsheet::ParseExcel;
my ($fname1) = @ARGV;
my $parser = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse($fname1);
my $new_workbook = Spreadsheet::WriteExcel->new('formated_list.xls', $fname1);
if (!defined $workbook) {
die $parser->error(), ".\n";
}
for my $worksheet ( $workbook->worksheets() ) {
my ($wsheet_name) = $worksheet->get_name();
my $new_worksheet = $new_workbook->add_worksheet($wsheet_name);
my ($row_min, $row_max) = $worksheet->row_range();
my ($col_min, $col_max) = $worksheet->col_range();
for my $row ($row_min .. $row_max) {
for …Run Code Online (Sandbox Code Playgroud) my $target_type = (defined($item->{target_type}) && $item->{target_type})
? $item->{target_type}
: "";
my $target_id = (defined($item->{target_id}) && $item->{target_id})
? $item->{target_id}
: "";
Run Code Online (Sandbox Code Playgroud)
为什么开发人员使用&&几乎相同的条件?
我正在使用Try::Tinytry-catch.
代码如下:
use Try::Tiny;
try {
print "In try";
wrongsubroutine(); # undefined subroutine
}
catch {
print "In catch";
}
somefunction();
Run Code Online (Sandbox Code Playgroud)
...
sub somefunction {
print "somefunction";
}
Run Code Online (Sandbox Code Playgroud)
当我执行时它是这样的:
somefunction
In Try
In catch
Run Code Online (Sandbox Code Playgroud)
输出序列对我来说是错误的.这是错的吗?或这是正常的行为吗?
所以说我创建了一组这样的数组:
my (@device, @mount, @type, @options, @dump, @pass) = ();
Run Code Online (Sandbox Code Playgroud)
然后我想在其中创建一个包含这些数组的数组.我该怎么办?我试着用:
my @columns = (@device, @mount, @type, @options, @dump, @pass);
Run Code Online (Sandbox Code Playgroud)
和
my @columns = ([@device], [@mount], [@type], [@options], [@dump], [@pass]);
Run Code Online (Sandbox Code Playgroud)
问题似乎是@columns仍为空.我觉得我犯了一个非常简单的语法错误.我做错了什么?
我有2个文件
**a.txt**
cars
bikes
bus
vehicle
atv
**b.txt**
hawk
hero
atv
bus
***result.txt***
cars
bikes
vehicle
hawk
hero
Run Code Online (Sandbox Code Playgroud)
我想打印2个文件之间的差异.现在我尝试了一个代码,但它以随机的方式给了我差异; 我希望它以适当的顺序方式显示它.任何人都可以帮助我.
use strict;
my %results = ();
open FILE1, "<a.txt"
or die "Could not open file: $! \n";
while (my $line = <FILE1>) {
$results{$line}=1;
}
close FILE1;
open FILE2, "<b.txt"
or die "Could not open file: $! \n";
while (my $line = <FILE2>) {
$results{$line}++;
}
close FILE2;
open OUTFILE, ">>result.txt"
or die "Cannot open $outfile for writing \n";
foreach …Run Code Online (Sandbox Code Playgroud) 我正在尝试打印数组,但输出只包含数组的最后一行.部分代码如下.
open OUT, "> /myFile.txt"
or die "Couldn't open output file: $!";
foreach (@result) {
print OUT;
}
Run Code Online (Sandbox Code Playgroud)
输出是
List Z
Run Code Online (Sandbox Code Playgroud)
这是最后一行,但是当我做出print "@result"去的时候是
List A
List B
List C so on...
Run Code Online (Sandbox Code Playgroud)
我有点混淆为什么在同一个数组上结果不同.
我有一个图像文件.(jpg或png)
这只有4种颜色和几条黑线.(600px X 600px图像尺寸).可以有2或4或6条黑线.
我需要得到每条黑线的(x1,y1)和(x2,y2).
可以使用perl或c或matlab实现
根据perlop:Smartmatch-Operator,代码如下:
use 5.012;
my @array = qw/1 2/;
print @array ~~ 2
? "true"
: "false";
Run Code Online (Sandbox Code Playgroud)
应该使用规则
左右描述和伪代码
============================================= ==================任何Num数字相等(如:Any == Num)
但输出是"假".但我想
@array == 2
Run Code Online (Sandbox Code Playgroud)
应该是真的.我哪里出错了?
我utf8::encode在使用pragma时遇到问题use open qw(:std :utf8);
例
#!/usr/bin/env perl
use v5.16;
use utf8;
use open qw(:std :utf8);
use Data::Dumper;
my $word = "+????";
say Dumper($word);
say utf8::is_utf8($word) ? 1 : 0;
utf8::encode($word);
say Dumper($word);
say utf8::is_utf8($word) ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)
产量
$VAR1 = "+\x{431}\x{430}\x{43d}\x{43a}";
1
$VAR1 = '+банк';
0
Run Code Online (Sandbox Code Playgroud)
当我删除这个pragma use open qw(:std :utf8);,一切都很好.
$VAR1 = "+\x{431}\x{430}\x{43d}\x{43a}";
1
$VAR1 = '+????';
0
Run Code Online (Sandbox Code Playgroud)
先谢谢你!