在阵列操作练习期间支持的常见问题是将二维阵列旋转90度.有一些SO帖子可以解答如何在各种编程语言中完成它.我的问题是澄清其中的一个答案,并探索需要什么样的思维过程才能以有机的方式得出答案.
我发现这个问题的解决方案如下:
public static void rotate(int[][] matrix,int n)
{
for( layer = 0;layer < n/2;++layer){
int first = layer;
int last = n -1 - layer;
for(int i = first;i<last;++i){
int offset = i - first;
int top = matrix[first][i];
matrix[first][i] = matrix[last-offset][first];
matrix[last-offset][first] = matrix[last][last-offset];
matrix[last][last-offset] = matrix[i][last];
matrix[i][last] = top;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有点想知道上面的代码试图做什么,它通过进行四向交换来交换四肢/角落,并对由一些偏移分隔的其他单元格做同样的事情.
单步执行此代码我知道它有效,我没有得到的是上面给出的算法的数学基础."层","第一","最后"和偏移背后的基本原理是什么?
"最后"怎么样n-1-layer?偏差为什么i-first?首先是什么偏移?
如果有人可以解释这个算法的起源并引导我完成思考过程以提出解决方案,那将是很好的.
谢谢
我需要添加50位数字,所以我将它们作为"字符串"处理,并编写我自己的函数将它们加在一起.后来,为了它的地狱,我尝试了这个:
readFile(shift (@ARGV));
sub readFile
{
my $file = shift; #contains a bunch of 50-digit numbers
my $result = 0;
open (my $inFile, $file);
while (<$inFile>)
{
chomp;
$result += $_;
}
print $result;
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是它奏效了.我不明白.在我曾经使用过的其他语言中,你必须使用某种特殊变量才能做到这一点.Perl会自动检测到您有一个非常大的数字并相应地处理它吗?如果是这样,如果提前知道他们将要处理非常大的数字,那么Perl模块是否比Perl处理它们更有效率?
提前致谢.
从本质上讲,这就是我想要做的事情:
if ($expression =~ /^\d{num}\w{num}$/)
{
#doSomething
}
Run Code Online (Sandbox Code Playgroud)
where num不是标识符,但可以表示任何大于0的整数(\d并且\w是任意选择的).我想匹配一个字符串,如果它包含两组相关字符,一组紧接着另一组,并且每组中的字符数相同.
在这个例子中,123abc并021202abcdef会匹配,但43abc不会,亦不会12ab3c或1234acbcde.
我是Java的新手,我在这里看到了一个问答部分,其中有两个例子,其中删除了可变性.在测试MutableString.java时:
import java.lang.reflect.Field;
public class MutableString {
public static void main(String[] args) {
String s = "Immutable";
String t = "Notreally";
mutate(s, t);
StdOut.println(t);
// strings are interned so this doesn't even print "Immutable" (!)
StdOut.println("Immutable");
}
// change the first min(|s|, |t|) characters of s to t
public static void mutate(String s, String t) {
try {
Field val = String.class.getDeclaredField("value");
Field off = String.class.getDeclaredField("offset");
val.setAccessible(true);
off.setAccessible(true);
int offset = off.getInt(s);
char[] value = (char[]) …Run Code Online (Sandbox Code Playgroud) 我正在阅读约书亚布洛赫的Java益智游戏.在谜题28中,我无法理解以下段落 -
这是有效的,因为浮点值越大,值与其后继值之间的距离越大.这种浮点值的分布是它们用固定数量的有效位表示的结果.将1添加到足够大的浮点值将不会更改该值,因为它不会"弥合"与其后继者之间的差距.
Integer,我们添加一个来获得下一个Integer,但是如果float,我们如何获得下一个float值?如果我有IEEE-754格式的浮点值,我是否在尾数部分添加1以获得下一个浮点数?我需要一个提供键-值映射关系的数据结构,例如和Map,但还允许我基于(int)索引(例如myKey = myDS.get(index))来获取键,而不必遍历数据结构以使键位于所需的位置指数。
我考虑过使用LinkedHashMap,但没有找到在给定索引处获取密钥的方法。我想念什么LinkedHashMap吗?还是我可以使用其他数据结构?
编辑:
这不是重复。另一个问题的正确答案是使用某种方法SortedMap; 但是,这不是对这个问题的正确答案,因为我希望能够Entry通过Integer索引从数据结构中检索到,这在任何Java库中都不支持。
为什么不hashCode()和equals()时,工作List实施对象存储自己的对象作为一个元素?
当我插入iPhone 5时,Xcode会识别它,但是当我构建我的代码并尝试在手机上运行它时,我收到此错误:
找不到此可执行文件的有效配置文件.
所以我去组织者,单击设备下的电话,然后单击添加到门户网站,但我收到此错误:
此团队中已存在编号为"..."的设备.
我究竟做错了什么?
以下是hashCode()for 的来源String:
public int hashCode()
{
int h = hash;
if (h == 0 && count > 0)
{
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++)
{
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
Run Code Online (Sandbox Code Playgroud)
off被初始化为offset,为0(我查看了源中的每个位置,每个赋值都为0,这就是全部).然后在for循环中,val迭代通过via off而不是i.为什么是这样?为什么不直接使用i和消除offset开始的需要?我认为存在一个很好的理由offset.任何见解?
基本上,我想找到任何子字符串第一次出现的索引:“ABC”、“DEF”或“GHI”,只要它们出现在三个间隔中。我为匹配此模式而编写的正则表达式是:
regex = compile ("(?:[a-zA-Z]{3})*?(ABC|DEF|GHI)")
Run Code Online (Sandbox Code Playgroud)
在*?确保我得到的第一场比赛,因为它的非贪婪。我正在使用捕获组,因为我认为这是实际获取我实际正在寻找的(子字符串的)索引的唯一方法。我不在乎比赛本身从哪里开始,只关心捕获组从哪里开始。在...{3}...该模式发生在3,即时间间隔的任务:
example_1 = "BNDABCDJML"
example_2 = "JKMJABCKME"
Run Code Online (Sandbox Code Playgroud)
example_1将匹配,因为"ABC"在位置3处发生,但example_2将不匹配,因为"ABC"在第4位发生。
理想情况下,给定字符串:
text = "STCABCFFC"
Run Code Online (Sandbox Code Playgroud)
这个匹配,但如果我只是得到比赛的开始,它会给我0,因为这是比赛的开始索引,我想要的是3
我想这样做:
print match(regex, text).group(1).start()
Run Code Online (Sandbox Code Playgroud)
但是,当然,这不起作用,因为start()它不是字符串的方法,而且字符串现在独立于text. 我不能简单地搜索捕获组中子字符串的起始索引,因为这不能保证它遵循正则表达式模式(仅以 3 为间隔出现)。也许我忽略了一些东西,我没有用python写太多,所以如果这是一个微不足道的问题,请原谅我。