Fundamental

1.2.2

2018-5-15
Fundamental

1.2.2 # 解答 # 同样实现了一个 Interval1D 类(位于 Geometry 库)。 JAVA 版本参考:http://algs4.cs.princeton.edu/12oop/Interval1D.java.html。 直接调用其中的 Intersect() 方法即可 代码 # Interval1D 类: # /// <summary> /// 一维闭区间。 /// </summary> public class Interval1D { /// <summary> /// 优先以起点升序排序,起点相同时按照终点升序排序。 /// </summary> /// <value>优先以起点升序排序,起点相同时按照终点升序排序。</value> public static readonly Comparer<Interval1D> MinOrder = new MinEndpointComparer(); /// <summary> /// 优先以终点升序排序,起点相同时按照起点升序排序。 /// </summary> /// <value>优先以终点升序排序,起点相同时按照起点升序排序。</value> public static readonly Comparer<Interval1D> MaxOrder = new MaxEndpointComparer(); /// <summary> /// 以区间长度升序排序。 /// </summary> /// <value>以区间长度升序排序。</value> public static readonly Comparer<Interval1D> LengthOrder = new LengthComparer(); /// <summary> /// 区间起点。 /// </summary> /// <value>区间起点。</value> /// <remarks>这个属性是只读的。</remarks> public double Min { get; } /// <summary> /// 区间终点。 /// </summary> /// <value>区间终点。</value> /// <remarks>这个属性是只读的。</remarks> public double Max { get; } /// <summary> /// 构造函数。 /// </summary> /// <param name="lo">一维区域的下界。</param> /// <param name="hi">一维区域的上界。</param> public Interval1D(double lo, double hi) { if (double. ...

1.2.3

2018-5-15
Fundamental

1.2.3 # 解答 # 首先先实现一个 Interval2D 类(位于 Geometry 库),再使用窗体应用程序绘图。 JAVA 版本参考:http://algs4.cs.princeton.edu/12oop/Interval2D.java.html。 代码 # Interval2D: # /// <summary> /// 二维闭合区间。 /// </summary> public class Interval2D { private readonly Interval1D _x; private readonly Interval1D _y; /// <summary> /// 构造函数。 /// </summary> /// <param name="x">x 轴上的范围。</param> /// <param name="y">y 轴上的范围。</param> public Interval2D(Interval1D x, Interval1D y) { _x = x; _y = y; } /// <summary> /// 判断两个平面是否相交。 /// </summary> /// <param name="that">需要判断的另一个平面。</param> /// <returns>相交则返回 <c>true</c>,否则返回 <c>false</c>。</returns> public bool Intersects(Interval2D that) { if (! ...

1.2.4

2018-5-15
Fundamental

1.2.4 # 解答 # 在 C# 中,这段代码能够完成交换的工作,输出为: world hello 代码 # var string1 = "hello"; var string2 = string1; string1 = "world"; Console.WriteLine(string1); Console.WriteLine(string2);

1.2.5

2018-5-15
Fundamental

1.2.5 # 解答 # string 类型中的 Uppercase() 以及 Substring() 都不会改变原有字符串,而是新建一个字符串并返回。 因此输出仍然为 Hello World。 代码 # var s = "Hello World"; s.ToUpper(); s.Substring(6, 5); // C# 中两个参数分别代表子串起始下标和长度 Console.WriteLine(s);

1.2.6

2018-5-15
Fundamental

1.2.6 # 解答 # 对于任意字符串 s,将其拆分成 s = s1 + s2(s2长度即为循环移动的位数) 其回环变位则为 s' = s2 + s1 显然 s' + s' = s2 + s1 + s2 + s1 即 s' + s' = s2 + s + s1,其中必定包含 s 例如 ABC 和 BCA, BCABCA 显然包含 ABC 代码 # var s1 = "ACTGACG"; var s2 = "TGACGAC"; Console.WriteLine(Circular(s1, s2)); // 对于任意字符串 s,将其拆分成 s = s1 + s2(s2长度即为循环移动的位数) // 其回环变位则为 s' = s2 + s1 // 显然 s' + s' = s2 + s1 + s2 + s1 // 即 s' + s' = s2 + s + s1,其中必定包含 s // 例如 ABC 和 BCA, BCABCA 显然包含 ABC static bool Circular(string s1, string s2) { return s1. ...

1.2.7

2018-5-15
Fundamental

1.2.7 # 解答 # 递归交换字符顺序,最后返回反序的字符串。 Mystery(ABCD) = Mystery(CD) + Mystery(AB) = Mystery(D) + Mystery(C) + Mystery(B) + Mystery(A) = DCBA 代码 # Console.WriteLine(Mystery("Hello1")); static string Mystery(string s) { var n = s.Length; if (n <= 1) return s; var a = s.Substring(0, n / 2); var b = s.Substring(n / 2, n - n / 2); return Mystery(b) + Mystery(a); }

1.2.8

2018-5-15
Fundamental

1.2.8 # 解答 # 作用就是交换两个数组。 但在 C# 或 JAVA 中,数组变量实际是数组的一个引用(类似于指针),交换两个引用的效率与数组大小无关(可以理解为只是交换了数组的名字,数组实际内容在内存中的位置没有改变),都是常数时间的。 代码 # // 读取 largeW.txt var allNums = File.ReadAllLines("largeW.txt"); var n = allNums.Length; var a = new int[n]; var b = new int[n]; // 数组 a 与数组 b 数字顺序相反 for (var i = 0; i < n; i++) { a[i] = int.Parse(allNums[i]); b[n - i - 1] = a[i]; } // 输出前5个数字 Console.WriteLine("Before Swap"); Console.Write("a:"); for (var i = 0; i < 5; i++) { Console. ...

1.2.9

2018-5-16
Fundamental

1.2.9 # 解答 # 首先实现一个 Counter 类,随后使用非递归版本的 BinarySearch,每进行一次 While 循环就让 Counter 加一。 代码 # Counter 类 # class Counter { private readonly string _name; private int _count; /// <summary> /// 构造函数。 /// </summary> /// <param name="id">计数器的名称。</param> public Counter(string id) { _name = id; } /// <summary> /// 计数器加一。 /// </summary> public void Increment() { _count++; } /// <summary> /// 获取当前计数值。 /// </summary> /// <returns></returns> public int Tally() { return _count; } /// <summary> /// 输出形如 “1 counter” 的字符串。 /// </summary> /// <returns></returns> public override string ToString() { return _count + " " + _name; } } Main # // 参考 1. ...

1.2.10

2018-5-16
Fundamental

1.2.10 # 解答 # 在 Counter 类基础上修改即可。 代码 # VisualCounter 类 # internal class VisualCounter { private readonly string _name; private int _count; private readonly int _max; private int _operatorTimes; /// <summary> /// 构造函数。 /// </summary> /// <param name="id">计数器的名称。</param> /// <param name="max">计数器的最大值。</param> /// <param name="operatorTimes">计数器的最大操作数。</param> public VisualCounter(string id, int max, int operatorTimes) { _name = id; _max = max; _operatorTimes = operatorTimes; } /// <summary> /// 计数器加一。 /// </summary> public bool Increment() { if (_operatorTimes <= 0) return false; if (_count < _max) { _count++; _operatorTimes--; } return true; } /// <summary> /// 计数器减一。 /// </summary> public bool Decreasement() { if (_operatorTimes <= 0) return false; if (_count > 0) { _count--; _operatorTimes--; } return true; } /// <summary> /// 获取当前计数值。 /// </summary> /// <returns>返回计数值。</returns> public int Tally() { return _count; } /// <summary> /// 返回形如 “1 counter” 的字符串。 /// </summary> /// <returns>返回形如 “1 counter” 的字符串。</returns> public override string ToString() { return _count + " " + _name; } /// <summary> /// 绘制计数器的图形。 /// </summary> /// <param name="g">画布。</param> /// <param name="width">绘图区宽度。</param> /// <param name="height">绘图区高度。</param> /// <param name="font">显示的字体。</param> public void Draw(Graphics g, int width, int height, Font font) { // 空画布 g. ...

1.2.11

2018-5-16
Fundamental

1.2.11 # 解答 # 在构造函数开始时做一次判断,非法时抛出异常。 首先建立一个数组,数组的第 1 项至第 12 项的值就是每个月的天数。 再声明一个布尔类型的变量,用于标记是否是闰年。 代码 # internal class SmartDate { public int Month { get; } // 月 public int Day { get; } // 日 public int Year { get; } // 年 // 每个月对应的天数,第 0 位空出来 private static readonly int[] DayOfMonth = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; public SmartDate(int m, int d, int y) { if (Vaildation(m, d, y) == false) throw new FormatException("Invaild Date"); Month = m; Day = d; Year = y; } private bool Vaildation(int m, int d, int y) { if (y < 0) return false; var isLeapYear = IsLeapYear(y); if (m > 12 || m < 1) return false; if (d < 0) return false; if (m == 2 && d > 29 && isLeapYear) return false; if (d > DayOfMonth[m]) return false; return true; } private bool IsLeapYear(int y) { if (y % 400 == 0) return true; if (y % 100 ! ...