Homework_3

今天虽然没有Insane Code,但70% of Feat都归@AlbertSu所有!最终在共同努力下,每个解答都比老师提供的答案少很多行。

1、Smoosh

这个题,不需要另外set一个array,然后再copy回原array。

只需要在原array上动手修改(覆盖)即可。用一个简单的for循环,maintain两个index:i与j,i记录原array的元素index,j记录最终array的有效元素index。

for循环可以不从0开始,因为index为0的元素肯定是在最终array中的。大体思路即是,遇到下一个不同于j的元素就填在j+1位置里,遇到下一个不同于j+1的元素就填在j+2位置里...

int j = 0;
for (int i = 1; i < ints.length; i++) {
	if (ints[i] != ints[j]) {
		ints[++j] = ints[i];
	}
}
Arrays.fill(ints, j + 1, ints.length, -1);
最后,再用一个array.fill的method就能把剩下所有空位都填满-1。


2、Squish

我一开始陷入了,需要用两个SListNode来maintain的漩涡。和下一个twin一样,我都想得太过于复杂繁琐,这点以后得注意。我一开始的思路是,寻找到下一个与自己不同的node,然后link在一起。但实际上,这样复杂、单一的逻辑关系,可以依靠电脑的计算能力,用简单却大量的逻辑关系堆叠完成。

(Messy Complex Logic) = CPU * (Simple Logic),我现在还不确定,哪种方法更好,但至少从逻辑层面和readable层面,后者更有优势。

SListNode theOne = head;
while (theOne != null && theOne.next != null) {
	if (theOne.next.item.equals(theOne.item)) {
		theOne.next = theOne.next.next;
	} else {
		theOne = theOne.next;
	}
}
这个的思路有点像recursive,即是让电脑,一个元素一个元素判断,相同就换下一个,不同就link。


3、Twin

思路用字母来表示。原link list:A-B-C-D

运算过程:

theNode = A

A2 (Refer to A的Item) links B

A links A2 links B

theNode = B
B2 (Refer to B的Item) links C

B links B2 links C

即:三个三个元素处理整个link list,只需要一个额外的SListNode来maintain整个过程。

SListNode node = head;
while (node != null) {
	node.next = new SListNode(node.item, node.next);
	node = node.next.next;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值