6/20 华为机试
总体比较简单,一个小时就做完了,测试用例全过,语言C#。但是光顾着过了也没再优化一下,还剩那么多时间不应该着急的……
1. 给一个范围,找勾股数组合,要求勾股数两两互质,没有就输出NA,比如[5,10]就是NA,因为6,8,10不互质,输出结果按a,b,c升序排列
就是考了一个GCD,排列的时候写了一个IComparer就完了,注意三角形要求a+b>c
public static void Find(int start, int end) { for (int i = start; i < end; i++) { for (int j = i + 1; j < end; j++) { int k = (int)Math.Sqrt(i * i + j * j); if (k * k != i * i + j * j || i + j <= k) continue; if (IsValid(i, j) && IsValid(j, k) && IsValid(i, k)) ans.Add(new res(i, j, k)); } } } public static int GCD(int a, int b) { if (a < b) { int temp = a; a = b; b = temp; } if (a % b == 0) return b; else return GCD(a % b, b); } public static bool IsValid(int a, int b) { if (GCD(a, b) == 1 || GCD(a, b) == a || GCD(a, b) == b) return true; return false; }
2. 太简单了我都没用本地IDE调,好像是给字符串a和b,找出b和a重复部分按升序排列,用SortedSet就完了
3. 给一个字符串,变成二叉树然后中序遍历,{}里是子树,,分割左子树和右子树,比如a{b{d{e{g,h{,i}}},c{f}},输出为dbgehijafc
构建二叉树,这段代码我写的比较丑,用while硬套的,拿递归或者栈写会好看很多,构建完以后就是送分题按左中右遍历
TreeNode start = new TreeNode(line[0]); TreeNode cur = start; int i = 1; while(i<line.Length) { if (line[i] == '{') { i++; if (line[i] == ',') { i++; if (char.IsLetter(line[i])) { TreeNode r = new TreeNode(line[i]); r.root = cur; cur.right = r; cur = cur.right; } i++; } else if (char.IsLetter(line[i])) { TreeNode l = new TreeNode(line[i]); l.root = cur; cur.left = l; i++; cur = cur.left; } } if (line[i] == ',') { cur = cur.root; i++; if (char.IsLetter(line[i])) { TreeNode r = new TreeNode(line[i]); r.root = cur; cur.right = r; cur = cur.right; } i++; } if (line[i] == '}') { cur = cur.root; i++; } } Traverse(start);