Fundamental

1.3.13

2018-5-17
Fundamental

1.3.13 # 解答 # 除了第一个以外都不可能。 根据题意,0 一定是最先入列的。 那么根据队列的特性,0 一定是最先出列的,因此除第一个以外其他几个序列都不可能。

1.3.14

2018-5-17
Fundamental

1.3.14 # 解答 # 对于 ResizingArrayQueueOfStrings 类,给出官方 JAVA 代码参考:ResizingArrayQueue.java。 代码 # ResizingArrayQueue 类 # /// <summary> /// 可变长度的队列。 /// </summary> /// <typeparam name="TItem">队列中要存放的元素。</typeparam> internal class ResizingArrayQueueOfStrings<TItem> : IEnumerable<TItem> { private TItem[] _q; private int _count; private int _first; private int _last; public ResizingArrayQueueOfStrings() { _q = new TItem[2]; _count = 0; _first = 0; } public bool IsEmpty() { return _count == 0; } public int Size() { return _count; } private void Resize(int capacity) { if (capacity < 0) throw new ArgumentException("capacity should be above zero"); var temp = new TItem[capacity]; for (var i = 0; i < _count; i++) { temp[i] = _q[(_first + i) % _q. ...

1.3.15

2018-5-17
Fundamental

1.3.15 # 解答 # 方法有很多,只要把所有输入保存,之后算出倒数第 k 个是正数第几个就可以了。 这里先全部入队,之后算出是正数第几个,再把前面的元素全部出队,剩下的第一个就是要求的元素了。 代码 # var queue = new Queue<string>(); var input = "1 2 3 4 5 6 7 8 9 10".Split(' '); var k = 4; foreach (var s in input) { queue.Enqueue(s); } var count = queue.Size() - k; for (var i = 0; i < count; i++) { queue.Dequeue(); } Console.WriteLine(queue.Peek()); 另请参阅 # Generics 库

1.3.16

2018-5-17
Fundamental

1.3.16 # 解答 # 在习题 1.2.19 里已经写好了接受字符串作为参数构造函数 这里只要把所有字符串读入并调用相应构造函数就可以了。 代码 # /// <summary> /// 从标准输入按行读取所有日期,返回一个日期数组。 /// </summary> /// <returns></returns> public static Date[] ReadDates() { char[] split = new char[] { '\n' }; string[] input = Console.In.ReadToEnd().Split(split, StringSplitOptions.RemoveEmptyEntries); Date[] d = new Date[input.Length]; for (int i = 0; i < input.Length; ++i) { d[i] = new Date(input[i]); } return d; }

1.3.17

2018-5-17
Fundamental

1.3.17 # 解答 # 和前一题类似,按行读取输入再调用相应构造函数就可以了。 代码 # /// <summary> /// 从标准输入中按行读取所有交易信息,返回一个 Transaction 数组。 /// </summary> /// <returns></returns> public static Transaction[] ReadTransactions() { char[] split = new char[] { '\n' }; string[] input = Console.In.ReadToEnd().Split(split, StringSplitOptions.RemoveEmptyEntries); Transaction[] t = new Transaction[input.Length]; for (int i = 0; i < input.Length; ++i) { t[i] = new Transaction(input[i]); } return t; }

1.3.18

2018-5-17
Fundamental

1.3.18 # 解答 # 删除该结点的下一个结点。 如下图,没有任何结点指向 y 结点,失去了所有引用的 y 结点会被 GC 清理掉。 代码 # var x = new Node<string>(); x.Item = "first"; var y = new Node<string>(); y.Item = "second"; x.Next = y; var z = new Node<string>(); z.Item = "third"; y.Next = z; Console.WriteLine("x: " + x.Item); Console.WriteLine("x.next: " + x.Next.Item); x.Next = x.Next.Next; Console.WriteLine(); Console.WriteLine("x: " + x.Item); Console.WriteLine("x.next: " + x.Next.Item); 另请参阅 # Generics 库

1.3.19

2018-5-17
Fundamental

1.3.19 # 解答 # 建立一个结点引用 Cur,让它移动到尾结点的前一个结点,让那个结点的 next 变为 null。 代码 # var first = new Node<string> { Item = "first" }; var second = new Node<string> { Item = "second" }; var third = new Node<string> { Item = "third" }; first.Next = second; second.Next = third; third.Next = null; var current = first; while (current != null) { Console.Write(current.Item + " "); current = current.Next; } DeleteLast(first); Console.WriteLine(); current = first; while (current ! ...

1.3.20

2018-5-18
Fundamental

1.3.20 # 解答 # 和上一题类似,只不过这次让 Cur 移动 k – 1 次即可。 代码 # /// <summary> /// 删除指定位置的元素,返回该元素。 /// </summary> /// <param name="index">需要删除元素的位置。</param> /// <returns></returns> public Item Delete(int index) { if (index >= this.count) { throw new IndexOutOfRangeException(); } Node<Item> front = this.first; Item temp = this.first.item; if (index == 0) { this.first = this.first.next; return temp; } for (int i = 1; i < index; ++i) { front = front. ...

1.3.21

2018-5-18
Fundamental

1.3.21 # 解答 # 遍历整条链表,方法和前两题类似,用一个结点引用 Cur 去访问就可以了。 代码 # var link = new LinkedList<string>(); link.Insert("first", 0); link.Insert("second", 1); link.Insert("third", 2); Console.WriteLine(Find(link, "second")); Console.WriteLine(Find(link, "fourth")); static bool Find<TItem>(LinkedList<TItem> link, TItem key) { foreach (var i in link) { if (i.Equals(key)) { return true; } } return false; } 另请参阅 # Generics 库

1.3.22

2018-5-18
Fundamental

1.3.22 # 解答 # 在 x 之后插入 t,如下图所示。 代码 # // 将 t 插入到 x 之后 var first = new Node<string>(); var second = new Node<string>(); var third = new Node<string>(); var fourth = new Node<string>(); first.Item = "first"; second.Item = "second"; third.Item = "third"; fourth.Item = "fourth"; first.Next = second; second.Next = third; third.Next = fourth; fourth.Next = null; var current = first; while (current != null) { Console. ...