• 关于

    翻转数组

    的搜索结果

问题

java中怎么把数组翻转

云计算小粉 2019-12-01 19:57:00 1055 浏览量 回答数 1

问题

Python 数组翻转指定个数的元素

游客ejnn55cgkof5g 2020-02-14 18:02:11 1 浏览量 回答数 1

问题

烧饼排序 5月22日【今日算法】

游客ih62co2qqq5ww 2020-05-22 14:11:07 8 浏览量 回答数 1

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

问题

【精品问答】Python3 实例80问(附源码解析)

珍宝珠 2020-02-17 13:11:47 1931 浏览量 回答数 3

问题

如何使用单个值填充/实例化C#数组?

保持可爱mmm 2020-01-16 16:53:19 1 浏览量 回答数 1

回答

试试用array_reverse翻转file函数返回的数组: $urls = file('list.txt'); 改为: $urls = array_reverse(file('list.txt')); 把那几个函数看看吧fopen fseek ftell fread fclose... 尤其是fseek

一枚小鲜肉帅哥 2020-06-20 20:12:40 0 浏览量 回答数 0

回答

有多种删除数组元素的方法,其中某些方法对某些特定任务比其他任务更有用。 删除一个数组元素 如果只想删除一个数组元素,则可以使用unset()或\array_splice()。 另外,如果您具有值并且不知道要删除元素的键,则可以使用\array_search()该键来获取键。 unset() 请注意,使用unset()数组键时不会更改/重新索引。如果要重新索引键,则可以使用它,\array_values()之后unset()将所有键转换为从0开始的数字枚举键。 码 "a", 1 => "b", 2 => "c"]; unset($array[1]); //↑ Key which you want to delete ?> 输出量 [ [0] => a [2] => c ] \array_splice() 方法 如果您使用\array_splice()这些键,则会自动为索引重新编制索引,但是关联键不会更改,相反,关联键会将\array_values()所有键转换为数字键。 还\array_splice()需要偏移量,不是关键!作为第二个参数。 码 "a", 1 => "b", 2 => "c"]; \array_splice($array, 1, 1); //↑ Offset which you want to delete ?> 输出量 [ [0] => a [1] => c ] array_splice()就像unset()通过引用获取数组一样,这意味着您不想将这些函数的返回值分配回数组。 删除多个数组元素 如果你想删除多个数组元素,不想打电话unset()或\array_splice()多次,你可以使用的功能\array_diff()或\array_diff_key()取决于如果你知道的值或要删除的元素的键。 \array_diff() 方法 如果知道要删除的数组元素的值,则可以使用\array_diff()。和以前一样,unset()它不会更改/重新索引数组的键。 码 "a", 1 => "b", 2 => "c"]; $array = \array_diff($array, ["a", "c"]); //└────────┘→ Array values which you want to delete ?> 输出量 [ [1] => b ] \array_diff_key() 方法 如果知道要删除的元素的键,则要使用\array_diff_key()。在这里,您必须确保将键作为第二个参数中的键而不是值来传递。否则,您必须使用翻转数组\array_flip()。而且这里的键不会更改/重新索引。 码 "a", 1 => "b", 2 => "c"]; $array = \array_diff_key($array, [0 => "xy", "2" => "xy"]); //↑ ↑ Array keys which you want to delete ?> 输出量 [ [1] => b ] 同样,如果您要使用unset()或\array_splice()删除具有相同值的多个元素,则可以使用\array_keys()获取特定值的所有键,然后删除所有元素。 问题来源于stack overflow

保持可爱mmm 2020-01-08 15:32:10 0 浏览量 回答数 0

回答

package javatest2; import java.util.ArrayList; public class JavaTest2 { public static void main(String[] args) { String[] Array = { "a", "b", "c", "d", "e" }; reverseArray1(Array);// 使用集合ArrayList实现反转 for (int j = 0; j < Array.length; j++) { System.out.print(Array[j] + " "); } System.out.print("\n"); String[] temp = reverseArray2(Array);// 直接使用数组实现反转 for (int j = 0; j < temp.length; j++) { System.out.print(Array[j] + " "); } } /* * 函数:reverseArray1和reverseArray2 * 功能:实现 数组翻转 * 例如:{'a','b','c','d'}变成{'d','c','b','a'} */ private static void reverseArray1(String[] Array) { ArrayList<String> array_list = new ArrayList<String>(); for (int i = 0; i < Array.length; i++) { array_list.add(Array[Array.length - i - 1]); } Array = array_list.toArray(Array); } private static String[] reverseArray2(String[] Array) { String[] new_array = new String[Array.length]; for (int i = 0; i < Array.length; i++) { // 反转后数组的第一个元素等于源数组的最后一个元素: new_array[i] = Array[Array.length - i - 1]; } return new_array; } }

津崎平匡 2020-03-16 23:40:10 0 浏览量 回答数 0

问题

在PHP中转置多维数组

保持可爱mmm 2020-02-08 21:56:23 0 浏览量 回答数 1

问题

不可不会的反转链表 6月28日 【今日算法】

游客ih62co2qqq5ww 2020-06-28 15:55:03 2 浏览量 回答数 1

问题

【今日算法】备战大厂必备题目,持续更新

游客ih62co2qqq5ww 2020-04-08 09:21:40 3542 浏览量 回答数 4

问题

【javascript学习全家桶】934道javascript热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:22 6202 浏览量 回答数 1

问题

偶数矩阵,神答案,我看不懂

a123456678 2019-12-01 19:45:07 851 浏览量 回答数 1

回答

概念: 红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由Rudolf Bayer发明的,他称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。   红黑树是一种很有意思的平衡检索树。它的统计性能要好于平衡二叉树(有些书籍根据作者姓名,Adelson-Velskii和Landis,将其称为AVL-树),因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更好的性能,以及对set操作的支持)。 背景和术语: 红黑树是一种特定类型的二叉树,它是在计算机科学中用来组织数据比如数字的块的一种结构。所有数据块都存储在节点中。这些节点中的某一个节点总是担当启始位置的功能,它不是任何节点的儿子;我们称之为根节点或根。它有最多两个"儿子",都是它连接到的其他节点。所有这些儿子都可以有自己的儿子,以此类推。这样根节点就有了把它连接到在树中任何其他节点的路径。 如果一个节点没有儿子,我们称之为叶子节点,因为在直觉上它是在树的边缘上。子树是从特定节点可以延伸到的树的某一部分,其自身被当作一个树。在红黑树中,叶子被假定为 null 或空。 由于红黑树也是二叉查找树,它们当中每一个节点都的比较值都必须大于或等于在它的左子树中的所有节点,并且小于或等于在它的右子树中的所有节点。这确保红黑树运作时能够快速的在树中查找给定的值。 用途和好处: 红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。这不只是使它们在时间敏感的应用如即时应用(real time application)中有价值,而且使它们有在提供最坏情况担保的其他数据结构中作为建造板块的价值;例如,在计算几何中使用的很多数据结构都可以基于红黑树。 红黑树在函数式编程中也特别有用,在这里它们是最常用的持久数据结构之一,它们用来构造关联数组和集合,在突变之后它们能保持为以前的版本。除了O(log n)的时间之外,红黑树的持久版本对每次插入或删除需要O(log n)的空间。 红黑树是 2-3-4树的一种等同。换句话说,对于每个 2-3-4 树,都存在至少一个数据元素是同样次序的红黑树。在 2-3-4 树上的插入和删除操作也等同于在红黑树中颜色翻转和旋转。这使得 2-3-4 树成为理解红黑树背后的逻辑的重要工具,这也是很多介绍算法的教科书在红黑树之前介绍 2-3-4 树的原因,尽管 2-3-4 树在实践中不经常使用。 属性: 红黑树是每个节点都有颜色特性的二叉查找树,颜色的值是红色或黑色之一。除了二叉查找树带有的一般要求,我们对任何有效的红黑树加以如下增补要求: 1.节点是红色或黑色。 2.根是黑色。 3.每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 4.从每个叶子到根的所有路径都包含相同数目的黑色节点。 这些约束强制了红黑树的关键属性: 从根到叶子的最长的可能路径不大于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值都要求与树的高度成比例的最坏情况时间,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。 在很多树数据结构的表示中,一个节点有可能只有一个儿子,而叶子节点包含数据。用这种范例表示红黑树是可能的,但是这会改变一些属性并使算法复杂。为此,本文中我们使用 "null 叶子" 或"空(null)叶子",如上图所示,它不包含数据而只充当树在此结束的指示。这些节点在绘图中经常被省略,导致了这些树好像同上述原则相矛盾,而实际上不是这样。与此有关的结论是所有节点都有两个儿子,尽管其中的一个或两个可能是空叶子。 操作: 在红黑树上只读操作不需要对用于二叉查找树的操作做出修改,因为它也二叉查找树。但是,在插入和删除之后,红黑属性可能变得违规。恢复红黑属性需要少量(O(log n))的颜色变更(这在实践中是非常快速的)并且不超过三次树旋转(对于插入是两次)。这允许插入和删除保持为 O(log n) 次,但是它导致了非常复杂的操作。

寒凝雪 2019-12-02 01:19:37 0 浏览量 回答数 0

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19

回答

请仔细阅读“ 数据规范化”,“ 常规索引”概念和“ 外键”约束,以确保数据干净,引用完整性。这会带你去。 在纸上,将数据存储在数组中似乎很自然,但是对于db引擎,性能几乎没有索引的使用。此外,您将在第2天发现获取和维护数据是一场噩梦。 以下内容将使您在开始修补时有个良好的开端。也加入。 create table student ( studentId int auto_increment primary key, fullName varchar(100) not null -- etc ); create table dept ( deptId int auto_increment primary key, deptName varchar(100) not null -- Economics -- etc ); create table course ( courseId int auto_increment primary key, deptId int not null, courseName varchar(100) not null, -- etc CONSTRAINT fk_crs_dept FOREIGN KEY (deptId) REFERENCES dept(deptId) ); create table SCJunction ( -- Student/Course Junction table (a.k.a Student is taking the course) -- also holds the attendance and grade id int auto_increment primary key, studentId int not null, courseId int not null, term int not null, -- term (I am using 100 in below examples for this term) attendance int not null, -- whatever you want, 100=always there, 0=he must have been partying, grade int not null, -- just an idea -- See (Note Composite Index) at bottom concerning next two lines. unique key(studentId,courseId,term), -- no duplicates allowed for the combo (note student can re-take it next term) key (courseId,studentId), CONSTRAINT fk_sc_student FOREIGN KEY (studentId) REFERENCES student(studentId), CONSTRAINT fk_sc_courses FOREIGN KEY (courseId) REFERENCES course(courseId) ); 创建测试数据 insert student(fullName) values ('Henry Carthage'),('Kim Billings'),('Shy Guy'); -- id's 1,2,3 insert student(fullName) values ('Shy Guy'); insert dept(deptName) values ('History'),('Math'),('English'); -- id's 1,2,3 insert course(deptId,courseName) values (1,'Early Roman Empire'),(1,'Italian Nation States'); -- id's 1 and 2 (History dept) insert course(deptId,courseName) values (2,'Calculus 1'),(2,'Linear Algebra A'); -- id's 3 and 4 (Math dept) insert course(deptId,courseName) values (3,'World of Chaucer'); -- id 5 (English dept) -- show why FK constraints are important based on data at the moment insert course(deptId,courseName) values (66,'Fly Fishing 101'); -- will generate error 1452. That dept 66 does not exist -- That error is a good error to have. Better than faulty data -- Have Kim (studentId=2) enrolled in a few courses insert SCJunction(studentId,courseId,term,attendance,grade) values (2,1,100,-1,-1); -- Early Roman Empire, term 100 (made up), unknown attendance/grade insert SCJunction(studentId,courseId,term,attendance,grade) values (2,4,100,-1,-1); -- Linear Algebra A insert SCJunction(studentId,courseId,term,attendance,grade) values (2,5,100,-1,-1); -- World of Chaucer -- Have Shy Guy (studentId=3) enrolled in one course only. He is shy insert SCJunction(studentId,courseId,term,attendance,grade) values (3,5,100,-1,-1); -- Early Roman Empire, term 100 (made up), unknow attendance/grade -- note if you run that line again, the Error 1062 Duplicate entry happens. Can't take same course more than once per term 一些简单的问题。 什么部门在什么课程? 全部显示,使用表别名(缩写)来减少键入,提高可读性(有时) select c.courseId,c.courseName,d.deptId,d.deptName from course c join dept d on c.deptId=d.deptId order by d.deptName,c.courseName -- note the order +----------+-----------------------+--------+----------+ | courseId | courseName | deptId | deptName | +----------+-----------------------+--------+----------+ | 5 | World of Chaucer | 3 | English | | 1 | Early Roman Empire | 1 | History | | 2 | Italian Nation States | 1 | History | | 3 | Calculus 1 | 2 | Math | | 4 | Linear Algebra A | 2 | Math | +----------+-----------------------+--------+----------+ 这学期谁在上乔科世界课程? (知道courseId = 5) 以下内容受益于我们在SCJunction中的综合指数之一。组合是一个以上列的索引。 select s.StudentId,s.FullName from SCJunction j join student s on j.studentId=s.studentId where j.courseId=5 and j.term=100 +-----------+--------------+ | StudentId | FullName | +-----------+--------------+ | 2 | Kim Billings | | 3 | Shy Guy | +-----------+--------------+ 金比林斯(King Billings)入学这个词是什么? select s.StudentId,s.FullName,c.courseId,c.courseName from SCJunction j join student s on j.studentId=s.studentId join course c on j.courseId=c.courseId where s.studentId=2 and j.term=100 order by c.courseId DESC -- descending, just for the fun of it +-----------+--------------+----------+--------------------+ | StudentId | FullName | courseId | courseName | +-----------+--------------+----------+--------------------+ | 2 | Kim Billings | 5 | World of Chaucer | | 2 | Kim Billings | 4 | Linear Algebra A | | 2 | Kim Billings | 1 | Early Roman Empire | +-----------+--------------+----------+--------------------+ 金不堪重负,所以放弃数学课 delete from SCJunction where studentId=2 and courseId=4 and term=100 在select语句上方运行该语句,以显示Kim正在采取的措施: +-----------+--------------+----------+--------------------+ | StudentId | FullName | courseId | courseName | +-----------+--------------+----------+--------------------+ | 2 | Kim Billings | 5 | World of Chaucer | | 2 | Kim Billings | 1 | Early Roman Empire | +-----------+--------------+----------+--------------------+ 嗯,这个词更容易理解。爸爸虽然不会高兴。 注意诸如SCJunction.term之类的东西。关于这一点,可以写很多东西,我现在大部分时间会跳过它,只是说它也应该在FK中。您可能希望您的术语看起来更像是SPRING2015,而不是int。 就ID而言。这就是我要做的方式。这是个人喜好。这将需要知道id#,然后查找它们。其他人可能会选择一个具有HIST101之类的courseId而不是17的那些。它们具有更高的可读性(但索引速度较慢(勉强))。 票据综合指数 复合索引(INDEX表示KEY,反之亦然)是一种组合多列以进行快速数据检索的索引。翻转SCJunction表中两个组合的顺序,以便db引擎根据要追随数据的查询范围,可以根据要追寻的最左边的列选择用于快速检索的索引。 至于唯一密钥#1,它旁边的注释表明不重复(意味着垃圾数据),这是不言自明的。例如,该表中不能存在两次学生1课程1术语1。 要理解的一个关键概念是left-most索引中列名的顺序概念。 对于studentId 仅进行的查询,则使用studentId列在第一(left-most)处的键。在courseId 仅执行的查询中,则courseId使用最左边的键。在studentId和courseId之后的查询中,数据库引擎可以决定要使用哪个组合键。 当我说“去”时,我的意思是“ on clause或” where clause条件。 如果不让这两个复合键(其中的第1列和第2列翻转),那么在查询中未对要查询的列建立left-most索引的情况下,您将不会受益于键的使用,并且会遭受缓慢的表扫描以返回数据。 因此,这两个索引结合了以下两个概念 基于最左边或最左边(studentId和courseId列)的快速数据检索 根据studentId,courseId和term值在该表中强制非重复数据 外卖 重要的外卖是,结表作出快速索引检索和数据与逗号分隔的数据(数组心态)的健全的管理塞进一列,并使用这样的构建体的所有的痛苦。来源:stack overflow

保持可爱mmm 2020-05-11 12:00:27 0 浏览量 回答数 0

问题

java写的扫雷遇到数组越界异常报错

因为相信,所以看见。 2020-05-25 15:58:35 18 浏览量 回答数 1

回答

请仔细阅读“ 数据规范化”,“ 常规索引”概念和“ 外键”约束,以确保数据干净,引用完整性。这会带你去。 在纸上,将数据存储在数组中似乎很自然,但是对于db引擎,性能几乎没有索引的使用。此外,您将在第2天发现获取和维护数据是一场噩梦。 以下内容将使您在开始修补时有个良好的开端。也加入。 create table student ( studentId int auto_increment primary key, fullName varchar(100) not null -- etc ); create table dept ( deptId int auto_increment primary key, deptName varchar(100) not null -- Economics -- etc ); create table course ( courseId int auto_increment primary key, deptId int not null, courseName varchar(100) not null, -- etc CONSTRAINT fk_crs_dept FOREIGN KEY (deptId) REFERENCES dept(deptId) ); create table SCJunction ( -- Student/Course Junction table (a.k.a Student is taking the course) -- also holds the attendance and grade id int auto_increment primary key, studentId int not null, courseId int not null, term int not null, -- term (I am using 100 in below examples for this term) attendance int not null, -- whatever you want, 100=always there, 0=he must have been partying, grade int not null, -- just an idea -- See (Note Composite Index) at bottom concerning next two lines. unique key(studentId,courseId,term), -- no duplicates allowed for the combo (note student can re-take it next term) key (courseId,studentId), CONSTRAINT fk_sc_student FOREIGN KEY (studentId) REFERENCES student(studentId), CONSTRAINT fk_sc_courses FOREIGN KEY (courseId) REFERENCES course(courseId) ); 创建测试数据 insert student(fullName) values ('Henry Carthage'),('Kim Billings'),('Shy Guy'); -- id's 1,2,3 insert student(fullName) values ('Shy Guy'); insert dept(deptName) values ('History'),('Math'),('English'); -- id's 1,2,3 insert course(deptId,courseName) values (1,'Early Roman Empire'),(1,'Italian Nation States'); -- id's 1 and 2 (History dept) insert course(deptId,courseName) values (2,'Calculus 1'),(2,'Linear Algebra A'); -- id's 3 and 4 (Math dept) insert course(deptId,courseName) values (3,'World of Chaucer'); -- id 5 (English dept) -- show why FK constraints are important based on data at the moment insert course(deptId,courseName) values (66,'Fly Fishing 101'); -- will generate error 1452. That dept 66 does not exist -- That error is a good error to have. Better than faulty data -- Have Kim (studentId=2) enrolled in a few courses insert SCJunction(studentId,courseId,term,attendance,grade) values (2,1,100,-1,-1); -- Early Roman Empire, term 100 (made up), unknown attendance/grade insert SCJunction(studentId,courseId,term,attendance,grade) values (2,4,100,-1,-1); -- Linear Algebra A insert SCJunction(studentId,courseId,term,attendance,grade) values (2,5,100,-1,-1); -- World of Chaucer -- Have Shy Guy (studentId=3) enrolled in one course only. He is shy insert SCJunction(studentId,courseId,term,attendance,grade) values (3,5,100,-1,-1); -- Early Roman Empire, term 100 (made up), unknow attendance/grade -- note if you run that line again, the Error 1062 Duplicate entry happens. Can't take same course more than once per term 一些简单的问题。 什么部门在什么课程? 全部显示,使用表别名(缩写)来减少键入,提高可读性(有时) select c.courseId,c.courseName,d.deptId,d.deptName from course c join dept d on c.deptId=d.deptId order by d.deptName,c.courseName -- note the order +----------+-----------------------+--------+----------+ | courseId | courseName | deptId | deptName | +----------+-----------------------+--------+----------+ | 5 | World of Chaucer | 3 | English | | 1 | Early Roman Empire | 1 | History | | 2 | Italian Nation States | 1 | History | | 3 | Calculus 1 | 2 | Math | | 4 | Linear Algebra A | 2 | Math | +----------+-----------------------+--------+----------+ 这学期谁在上乔科世界课程? (知道courseId = 5) 以下内容受益于我们在SCJunction中的综合指数之一。组合是一个以上列的索引。 select s.StudentId,s.FullName from SCJunction j join student s on j.studentId=s.studentId where j.courseId=5 and j.term=100 +-----------+--------------+ | StudentId | FullName | +-----------+--------------+ | 2 | Kim Billings | | 3 | Shy Guy | +-----------+--------------+ 金比林斯(King Billings)入学这个词是什么? select s.StudentId,s.FullName,c.courseId,c.courseName from SCJunction j join student s on j.studentId=s.studentId join course c on j.courseId=c.courseId where s.studentId=2 and j.term=100 order by c.courseId DESC -- descending, just for the fun of it +-----------+--------------+----------+--------------------+ | StudentId | FullName | courseId | courseName | +-----------+--------------+----------+--------------------+ | 2 | Kim Billings | 5 | World of Chaucer | | 2 | Kim Billings | 4 | Linear Algebra A | | 2 | Kim Billings | 1 | Early Roman Empire | +-----------+--------------+----------+--------------------+ 金不堪重负,所以放弃数学课 delete from SCJunction where studentId=2 and courseId=4 and term=100 在select语句上方运行该语句,以显示Kim正在采取的措施: +-----------+--------------+----------+--------------------+ | StudentId | FullName | courseId | courseName | +-----------+--------------+----------+--------------------+ | 2 | Kim Billings | 5 | World of Chaucer | | 2 | Kim Billings | 1 | Early Roman Empire | +-----------+--------------+----------+--------------------+ 嗯,这个词更容易理解。爸爸虽然不会高兴。 注意诸如SCJunction.term之类的东西。关于这一点,可以写很多东西,我现在大部分时间会跳过它,只是说它也应该在FK中。您可能希望您的术语看起来更像是SPRING2015,而不是int。 就ID而言。这就是我要做的方式。这是个人喜好。这将需要知道id#,然后查找它们。其他人可能会选择一个具有HIST101之类的courseId而不是17的那些。它们具有更高的可读性(但索引的速度(几乎没有))。因此,对您来说最好的方法是。 票据综合指数 复合索引(INDEX表示KEY,反之亦然)是一种组合多列以进行快速数据检索的索引。翻转SCJunction表中两个组合的顺序,以便db引擎根据要追随数据的查询范围,可以根据要追寻的最左边的列选择用于快速检索的索引。 至于唯一密钥#1,它旁边的注释表明不重复(意味着垃圾数据),这是不言自明的。例如,该表中不能存在两次学生1课程1术语1。 要理解的一个关键概念是left-most索引中列名的顺序概念。 对于studentId 仅进行的查询,则使用studentId列在第一(left-most)处的键。在courseId 仅执行的查询中,则courseId使用最左边的键。在studentId和courseId之后的查询中,数据库引擎可以决定要使用哪个组合键。 当我说“去”时,我的意思是“ on clause或” where clause条件。 如果不让这两个复合键(其中的第1列和第2列翻转),那么在查询中未对要查询的列建立left-most索引的情况下,您将不会受益于键的使用,并且将需要很慢的表扫描来返回数据。 因此,这两个索引结合了以下两个概念 基于最左边或最左边(studentId和courseId列)的快速数据检索 根据studentId,courseId和term值在该表中强制非重复数据

你的答案 2020-05-08 15:56:23 0 浏览量 回答数 0

回答

不良的编程习惯TOP1:粘贴复制 在学生时代,我们都知道抄袭是不对的。但在工作中,这方面的规则还很模糊。虽然有些代码块是不能盗用的——不要把专有代码拷贝到你的堆栈中,尤其是这些代码有标记版权信息。这种时候你应该编写自己的版本,老板付你薪水就是要做正事的。 但是当原始创作者想要共享代码时,问题就变得复杂了。这些共享代码也许放到了某个在线编程论坛上,也许它们是带有许可证(BSD,MIT)的开放源代码,允许使用一到三个函数。你使用这些共享代码是没有问题的,而且你上班是为了解决问题,而不是重新发明轮子。 大多数情况下,复制代码的优势非常明显,小心对待的话问题也不大。至少那些从靠谱的来源获得的代码已经被大致“检查“过了。 问题的复杂之处在于,这些共享代码是否存在一些未发现的错误,代码的用途或底层数据是否存在一些特别的假设。也许你的代码混入了空指针,而原始代码从未检查过。如果你能解决这些问题,那么就可以理解为你的老板得到了两位程序员共同努力的成果。这就是某种形式的结对编程,而且用不着什么高大上的办公桌。 不良的编程习惯TOP2:非函数式代码 在过去十年间,函数范式愈加流行。喜欢用嵌套函数调用来构建程序的人们引用了很多研究成果。这些研究表明,与旧式的变量和循环相比,函数式编程代码更安全,错误更少,而且可以随程序员的喜好任意组合在一起。粉丝们十分追捧函数式编程,还会在代码审查和拉取请求中诋毁非函数式方法。关于这种方法的优势,他们的观点其实并没有错。 但有时你需要的仅仅是一卷胶带而已。精心设计并细心计划的代码需要花费很多时间,不仅需要花费时间想象,还需要构建和之后导航的时间。这些都增加了复杂性,并且会花费很多的时间与精力。开发漂亮的函数式代码需要提前做计划,还要确保所有数据都通过正确的途径传递。有时找出并更改变量会简单得多,可能再加个注释说明一下就够了。就算要在注释中为之后的程序员致以冗长而难懂的歉意,也比重新设计整个系统,把它扳回正轨上要省事得多。 不良的编程习惯第 3 位:非标准间距 软件中的大多数空格都不会影响程序的性能。除少数使用间距指示代码块的语言(如 Python)外,大多数空格对程序行为的影响为零。尽管如此,仍然有一些得了强迫症的程序员会数空格,并坚持认为它们很重要。曾有这样一位程序员以最严肃的口吻告诉我的老板,说我正在写“非标准代码”,还说他一眼就看出来了。我的错咯?因为我没在等号的两侧放置空格,违反了 ESLint space-infix-ops 规则[1]。 有时候你只要操心那些更深层的内容就行了,谁管什么空格的位置。也许你担心数据库过载,也许你担心空指针可能会让你的代码崩溃。一套代码中,几乎所有的部分都比空格更重要,就算那些喜欢走形式的标准委员会写出来一大堆规则来限制这些空格或制表符的位置,那又如何呢。 令人欣喜的是,网上可以找到一些很好用的工具来自动重新格式化你的代码,让你的代码遵守所有精心定义的 linting 规则。人类不应该在这种事情上浪费时间和脑细胞。如果这些规则这么重要,我们就应该用工具来解决这些问题。 不良的编程习惯第 4 位:使用 goto 禁止使用 goto 的规则可以追溯到许多结构化编程工具还没有出现的时代。如果程序员想创建一个循环或跳转到另一个例程,则需要键入 goto,后跟一个行号。多年之后,编译器团队开始允许程序员使用字符串标签来代替行号。这在当时被认为是一项热门的新特性。 有的人把这样做法的结果称为“意大利面条式代码”。因为以后没人能读懂你的代码,没人搞得清楚执行路径。成为一团混乱的线程,缠结在一起。Edsger Dijkstra 写过一篇题为“我们认为 goto 声明是有害的”的一篇文章[2],号召大家拒绝使用这个命令。 但是绝对分支并不是问题所在,问题在于它产生的那堆纠缠的结果。一般来说,精心设计的 break 或 return 能提供有关该位置的代码执行情况的非常清晰的陈述。有时,将 goto 添加到一个 case 语句中所生成的东西与联 if-then-else 块的相比,结构更正确的列表理解起来更容易。 也有反例。苹果 SSL 堆栈中的“goto fail”安全漏洞[3]就是一个很好的例子。但是,如果我们谨慎地避免 case 语句和循环中出现的一些问题,我们就可以插入很好用的绝对跳转,使代码读者更容易理解正在发生的事情。有时我们可以放一个 break 或 return,不仅更简洁,而且大家读起来更愉快,除了那些讨厌 goto 的人们。 不良的编程习惯第 5 位:不声明类型 热爱类型化语言的人们有他们的理由。当我们为每个变量的数据类型添加清晰的声明时,我们会编写更好,错误更少的代码。花点时间来阐明类型,就可以帮助编译器在代码开始运行之前标记出愚蠢的错误。这可能会很痛苦,但也会有回报。这是一种编程的笨办法,就是为了避免错误。 时代变了。许多较新的编译器已经足够聪明了,它们可以在查看代码时推断出类型。它们可以在代码中前后移动,最后确认变量应该是 string 或 int,抑或是其他类型。而且,如果推断出来的这些类型没法对齐,则编译器会给出错误标志。它们不需要我们再类型化变量了。 换句话说,我们可以省略一些最简单的声明,然后就能轻松节省一些时间了。代码变得更简洁,代码读者也往往能猜出 for 循环中名为 i 的变量是一个整数。 不良的编程习惯第 6 位:溜溜球代码 程序员喜欢将其称为“yo-yo 代码”。首先,这些值将存储为字符串,然后将它们解析为整数,接下来将它们转换回字符串。这种方法效率极低。你几乎能感受到一大堆额外负载让 CPU 不堪重负的样子。能快速编写代码的聪明程序员会调整自己的代码架构,以最大程度地减少转换。因为他们安排好了计划,他们的代码也能跑得更快。 但不管你信不信,有时溜溜球代码也是有意义的。有的时候,你需要用一个可以在自己的黑匣子里搞定一大堆智能操作的库。有的老板花了很多钱,请好多天才做出来这么一个库。如果这个库需要字符串形式的数据,那么你就得给它字符串,就算你最近刚把数据转换为整数也得再转回去。 当然,你可以重写所有代码以最大程度地减少转换,但这会花费一些时间。有时,代码多运行一分钟、一小时、一天甚至一周也是可以接受的,因为重写代码会花费更多时间。有时候,增加技术债务要比重新建立一笔技术债的成本更低些。 有时这种库里面不是专有代码,而是你很久以前编写的代码。有时,转换一次数据要比重写该库中的所有内容更省事。这种时候你就可以编写悠悠球代码了,不要怕,我们都遇到过这种事情。 不良的编程习惯第7位:编写自己的数据结构 有一条标准规则是,程序员在大二学完数据结构课程后,再也不要编写用于存储数据的代码了。已经有人编写过了我们所需要的所有数据结构,并且他们的代码经过了多年的测试和重新测试。这些结构与语言打包在一起,还可能是免费的。你自己写的代码只会是一堆错误。 但有的时候数据结构库的速度有点缓慢。有时候我们被迫使用的标准结构并不适合我们自己的代码。有时,库会要求我们在使用它的结构之前重新配置数据。有时,这些库带有笨重的保护,还有一些诸如线程锁定之类的特性,而我们的代码并不需要它们。 发生这种情况时就该编写我们自己的数据结构了。有时我们自己的结构会快很多,还可能让我们的代码更整洁,因为我们不需要一大堆额外的代码来重新精确地格式化数据。 不良的编程习惯第 8 位:老式循环 很久以前,创建 C 语言的某人想将所有抽象可能性封装在一个简单的构造中。这个构造开始时要做一些事情,每次循环都要做一些事情,所有事情都完成时还有一些方法来提示我们。当时,这似乎是一种拥有无限可能性的完美语法。 此一时彼一时,如今一些现代评论者只看到了其中的麻烦,发生的事情太多了,所有这些可能性既可能向善也可能作恶。这种构造让阅读和理解代码变得非常困难。他们喜欢更加函数式的的范式,其中没有循环,只有应用到列表的函数,还有映射到某些数据的计算模板。 有时无循环方法更简洁,尤其是当我们只有一个简单的函数和一个数组的时候。但还有些时候,老式的循环要简单得多,因为它可以做更多事情。例如,当你找到第一个匹配项后就立刻停止搜索,这样的代码就简单得多。 此外,要对数据执行多项操作时,映射函数会要求更严格的编码。假设你要对每个数字取绝对值,然后取平方根,最快的方案是先映射第一个函数,然后映射第二个函数,将数据循环两次。 不良的编程习惯第 9 位:在中间打破循环 从有一天开始,一个规则制定小组宣布每个循环都应该有一个“不变项”,就是一个在整个循环中都为真的逻辑语句。当不变量不再为真时,循环就结束了。这是处理复杂循环的好方法,但会带来一些令人抓狂的约束,例如禁止我们在循环中间使用 return 或 break。这条规则是禁止 goto 语句规则的子集。 这个理论很不错,但它通常会导致代码变得更复杂。考虑以下这种简单的情况,其中会扫描一个数组,找出通过测试的一个条目: while (i<a.length){ ... if (test(a[i]) then return a[i]; ... } 喜欢循环不变项的人们宁愿我们添加另一个布尔变量,将其称为 notFound,然后这样用它: while ((notFound) && (i<a.length){ ... if (test(a[i])) then notFound=false; ... } 如果这个布尔名称取得很合适,那就会是一段自我注释得很好的代码。它可以让大家理解起来更容易。但这也增加了复杂性。这还意味着要分配另一个局部变量并阻塞一个寄存器,编译器可能没那么聪明,没法修复这个错误。 有时使用 goto 或 jump 会更简洁。 不良的编程习惯第10位:重载运算符和函数 一些有趣的语言会让你绕一些大弯子,比如说重新定义看起来应该是常量的元素值。拿 Python 来说,至少在 2.7 版及更低版本中,它允许你键入 TRUE=FALSE。这不会引发某种逻辑崩溃,也不会导致宇宙的终结;它只是交换了 TRUE 和 FALSE 的含义。你还可以使用 C 预处理器和其他一些语言来玩这种危险的游戏。还有一些语言允许你重新定义加号之类的运算符。 有时候,在一大段代码中重新定义一个或一些所谓常量,结果效率会更高。有时,老板会希望代码执行完全不同的操作。当然,你可以检查代码,逐一更改对应的部分,也可以干脆重新定义现实来节省时间。别人会觉得你是天才。用不着重写庞大的库,只需翻转一下即可。 这里也许应该划一条底线。无论这种做法多有意思,看起来多聪明,你都不应该在家里做实验。这太危险了——我是认真的。

茶什i 2019-12-30 11:01:01 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 阿里云双十一主会场 阿里云双十一新人会场 1024程序员加油包 阿里云双十一拼团会场 场景化解决方案 阿里云双十一直播大厅