right相关知识
-
SQL Server RIGHT FunctionsRIGHT(string, n)函数,是处理字符数据获取子字符串。第一个参数是将要处理的字符串,第二个参数,是从字符串的右边开始截取的字符个数。例子:DECLARE @string NVARCHAR(50) = 'Mr. John'SELECT RIGHT(@string,4) AS [New String] 结果:
-
SQL Server中的LEFT、RIGHT函数SQL Server中的LEFT、RIGHT函数。 LEFT:返回字符串中从左边开始指定个数字符。 LEFT(character_expression,integer_expression); RIGTH:返回字符串从右边开始指定个数字符。 RIGHT(character_expression,integer_expression); 例: SELECT LEFT('abcedf',3) as leftResult; -- 返回从左侧数前 3 个字符,第二个参数不接收负数,会报错 SELECT RIGHT('abcedf',3) as rightResult; -- 返回从右侧数前 3 个字符 本文来自木庄网络博客> SQL Server中的LEFT、RIGHT函数
-
T-SQL RIGHT JOINRIGHT JOIN外联接与LEFT JOIN相似。取得右表所有记录,并按过滤条件ON去取得左表的记录,取得这些记录,如遇上没有匹配的列使用NULL填充。演示数据来源,两张表来自http://www.cnblogs.com/insus/articles/1977561.html这里的[Machine]表和[Job]表。例子,取得所有工作单,你将会到这些工作的分配给哪些机器加工和没有分配给机器加工的工作单:View Code SELECT M.[M_Id],J.[J_Id],[MachineName],[LineName],[JobNumber],[J_Date] FROM [dbo].[Machine] AS MRIGHT OUTER JOIN --OUTER关键词是可选的。[dbo].[Job] AS JON (M.[M_Id] = J.[M_Id]) 执
-
mysql常用连接查询join,left,right,crossselect package_name_en from tb_feature_package a cross join tb_package b on a.package_sid =b.sid where package_name_en is not null select package_name_en from tb_feature_package a left join tb_package b on a.package_sid =b.sid where package_name_en is not null union select package_name_en from tb_feature_package a right join tb_package b on a.package_sid =b.sid where package_name_en is not null update tb
right相关课程
right相关教程
- 4.RIGHT JOIN 右连接 同样以表 course 和 teacher 右连接为例:SELECT c.id AS course_id,c.*,t.* FROM course c RIGHT JOIN teacher t ON c.teacher_id=t.id;执行结果如下图:Tips:RIGHT JOIN 为右连接,是以右边的表为’基准’,若左表没有对应的值,用 NULL 来填补。
- 3. 快速排序算法的 Python 实现 首先我们实现上面的核心步骤,代码如下:# 代码位置:sort_algorithms.pydef get_num_position(nums, left, right): # 默认基准值为第一个 base = nums[left] while left < right: # 从最右边向左直到找到小于基准值的数 while left < right and nums[right] >= base: right -= 1 # 将小于基准数的值放到右边,left原来位置放的是基准值(base) nums[left] = nums[right] # 然后从左边往右遍历,直到找到大于基准值的数 while left < right and nums[left] <= base: left += 1 # 然后将left位置上的值放到right位置上,right位置上的值原本为base值 nums[right] = nums[left] # left=right的位置上就是基准值 nums[left] = base return left
- 5.实例 给一个块级元素添加 flex 属性 ,让其子元素平均分配空间。<div class="demo"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div></div>.demo{ display:flex; width:200px; height:60x; line-height:60px; border: 1px solid #ccc; border-right: none;}div>.item{ width:100px; border-right:1px solid #ccc; text-align: center; flex:1;}效果图块级元素平均分配空间647解释:容器 demo 设置了 flex 总宽度为200px,项目 item 设置宽度 100px;如果正常情况下会超出容器,我们通过设置 flex:1 让项目自适应容器,并等分了空间。给一个块级元素添加 inline-flex 属性,让其变成行内元素,子元素平均分配.demo{ display:inline-flex; width:200px; height:60x; line-height:60px; border: 1px solid #ccc; border-right: none;}div>.item{ width:100px; border-right:1px solid #ccc; text-align: center; flex:1;}效果图内联元素平分空间效果图648demo和文字在一行,demo变成内联元素了。一个左侧100px,右侧自适应的,左右布局 <div class="demo-2"> <div class="item-left">1</div> <div class="item-right">2</div> </div>.demo-2{ display:flex;}.item-left{ flex-basis: 100px;}.item-right{ flex-grow:1;}效果图左侧100px,右侧自适应的,左右布局效果图6494.一个左侧为100px,右侧最大为600px的左右布局.demo-2{ display:flex;}.item-left{ flex-basis: 100px; background: red; flex-shrink:0;}.item-right{ flex-basis: 600px; background: yellow;}左右布局650解释:右侧最大宽度为600,如果小于 600 右侧将随屏幕尺寸缩小。
- 2. 最小 K 个数 来看一道常见的面试题,题目描述如下:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。示例:输入: arr = [1,3,5,7,2,4,6,8], k = 4输出: [1,2,3,4]Tips:0 <= len(arr) <= 100000;0 <= k <= min(100000, len(arr));其实不用分治法,直接考虑快排之后选择前 k 个数即能通过题解。但是本题我们要换一种思路,使用分治法来解决该题。首先定义解决原问题的方法:def divide(arr, left, right, k): """ 找出arr[left:right+1]中的最小k个数并返回 """ pass终止条件很明显,我们要找数组中最小的 k 个数,如果数组长度为空或者长度小于 k,我们可以直接返回该数组:# 注意 left 和 right 用于限定数组# 终止条件if not k: return []# 终止条件if (right - left + 1) <= k: return arr[left: right + 1]分解列表和之前一样,都是对半分,mid = (left + right) // 2,那么数组会被划分为如下两个部分:arr[left:mid + 1] # 左半部分arr[mid + 1:right] # 右半部分对于的子问题的解为:# 得到左子列的最小k个数arr_left_k = divide(arr, left, mid, k)# 得到右子列的最小k个数arr_right_k = divide(arr, mid + 1, right, k)合并子结果,得到原问题的解首先定义方法:divide(nums, left, right, k),该方法会找出列表 nums[left:right + 1] 中前最小的 k 个数。我们用分治法后,将列表分成两个子列:nums[left:mid + 1] 和 nums[mid + 1:right + 1]。这样方法 divide(nums, left, mid, k) 返回的结果是左子列中前 k 个最小值,方法 divide(nums, mid + 1, right, k) 返回的结果是右边子列中前 k 个最小值。此时我们知道,整个数组的前 k 个最小值必定在这 2k 个元素中。那么接下来的问题就是从这两 k 个值中找出最小的 k 个数即可,简单点的方式就是快排后取前 k 个。当问题规模 n 远大于 k 时,我们会发现排序所耗时间 O(klogk)O(klogk)O(klogk) 非常小,这样也决定了该分治算法的高效性。# 组成2k个数的列表arr_k = []for i in range(len(arr_left_k)): arr_k.append(arr_left_k[i]) arr_k.extend(arr_right_k)# 使用快排方法,取前k个数,即为结果,直接返回arr_k.sort()最后返回我们想要的前 k 个元素即可:return arr_k[:k]综合上述几点,我们得到了如下完整的 Python 实现:def smallestK(arr, k): def divide(arr, left, right, k): # 终止条件 if not k: return [] # 终止条件 if (right - left + 1) <= k: return arr[left: right + 1] # 分治法 mid = (left + right) // 2 # 得到左子列的最小k个数 arr_left_k = divide(arr, left, mid, k) # 得到右子列的最小k个数 arr_right_k = divide(arr, mid + 1, right, k) # 组成2k个数的列表 arr_k = [] for i in range(len(arr_left_k)): arr_k.append(arr_left_k[i]) arr_k.extend(arr_right_k) # 使用快排方法,取前k个数,即为结果,直接返回 arr_k.sort() return arr_k[:k] return divide(arr, 0, len(arr) - 1, k)最后提交测试,处于中上游水平。这道题目比较经典的做法是使用堆排序的方法,得到的最小 k 个数,大家可以课后使用堆排序的方法完成。
- 5. 优化快速排序算法 对于优化快速排序,在这里我们只考虑最简单的一种优化思路,就是基准数的选择。前面的快排算法中,我们都是选择列表的第一个元素作为基准数,这在列表随机的情况下是没有什么问题的,但对本身有序的列表进行排序时,时间复杂度就会退化到 O(n2)O(n^2)O(n2)。我们来进行相关测试:# 冒泡排序算法import datetimeimport randomfrom sort_algorithms import get_num_position, quick_sort# python默认递归次数有限制,如果不进行设置,会导致超出递归最大次数import sys sys.setrecursionlimit(1000000)if __name__ == '__main__': # 对于设置10000,本人电脑会出现栈溢出错误 # nums = [random.randint(10, 10000) for i in range(6000)] nums = [i for i in range(6000)] start = datetime.datetime.now() quick_sort(nums, 0, len(nums) - 1) end = datetime.datetime.now() print('Running time: %s Seconds' % (end-start))第一个注释的语言是对 nums 列表随机生成,而第二个直接情况是直接生成有序的列表。我们分别看执行结果:# 随机列表快排PS C:\Users\spyinx\Desktop\学习教程\慕课网教程\算法慕课教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/学习教程/慕课网教程/算法慕课教程/code/test_algorithms.pyRunning time: 0:00:00.027907 Seconds# 有序列表快排PS C:\Users\spyinx\Desktop\学习教程\慕课网教程\算法慕课教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/学习教程/慕课网教程/算法慕课教程/code/test_algorithms.pyRunning time: 0:00:02.159677 Seconds可以看到明显的差别,差不多差了 80 倍,这确实是纯快排算法存在的一个问题。如果我们往这个有序列表中插入少量随机数,打破有序的情况,会看到性能会有较大提升。这个问题的根源在于基准数目的选择,对于有序的列表排序时每次都是选择的最小或者最大的值,这就是最坏的情况。一个显而易见的改进策略就是随机选择列表中的值作为基准数,另一种是从头 (left)、中 ([left + right] // 2) 和尾 (right) 这三个元素中取中间值作为基准数。我们分别进行测试:import randomdef get_base(nums, left, right): index = random.randint(left, right) if index != left: nums[left], nums[index] = nums[index], nums[left] return nums[left]def get_base_middle(nums, left, right): if left == right: return nums[left] mid = (left + right) >> 1 if nums[mid] > nums[right]: nums[mid], nums[right] = nums[right], nums[mid] if nums[left] > nums[right]: # nums[left]最大,nums[right]中间,所以交换 nums[left], nums[right] = nums[left], nums[mid] if nums[mid] > nums[left]: # 说明nums[left]最小, nums[mid]为中间值 nums[left], nums[mid] = nums[mid], nums[left] return nums[left]def get_num_position(nums, left, right): # base = nums[left] # 随机基准数 base = get_base(nums, left, right) # base = get_base_middle(nums, left, right) while left < right: # 和前面相同,以下两个while语句用于将基准数放到对应位置,使得基准数左边的元素都小于它,右边的数都大于它 while left < right and nums[right] >= base: right -= 1 nums[left] = nums[right] while left < right and nums[left] <= base: left += 1 nums[right] = nums[left] # 基准数的位置,并返回该位置值 nums[left] = base return left改进后的测试结果如下:# 有序列表-随机基准值PS C:\Users\spyinx\Desktop\学习教程\慕课网教程\算法慕课教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/学习教程/慕课网教程/算法慕课教程/code/test_algorithms.pyRunning time: 0:00:00.021890 Seconds# 随机列表-随机基准值PS C:\Users\spyinx\Desktop\学习教程\慕课网教程\算法慕课教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/学习教程/慕课网教程/算法慕课教程/code/test_algorithms.pyRunning time: 0:00:00.026948 Seconds# 有序列表-中位数基准值PS C:\Users\spyinx\Desktop\学习教程\慕课网教程\算法慕课教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/学习教程/慕课网教程/算法慕课教程/code/test_algorithms.pyRunning time: 0:00:00.012944 Seconds# 随机列表-中位数基准值 PS C:\Users\spyinx\Desktop\学习教程\慕课网教程\算法慕课教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/学习教程/慕课网教程/算法慕课教程/code/test_algorithms.pyRunning time: 0:00:00.020933 Seconds可以看到使用中位数基准值在有序列表情况下排序速度更快。最后还有一个简单的常用优化方案,就是当序列长度达到一定大小时,使用插入排序。# 改造前面的插入排序算法def insert_sort(nums, start, end): """ 插入排序 """ if not nums: return False for i in range(start + 1, end + 1): t = nums[i] for j in range(i - 1, start - 1, -1): k = j if nums[j] <= t: k = k + 1 break nums[j + 1] = nums[j] nums[k] = t return True # ...def quick_sort(nums, start, end): """ 快速排序算法 """ if (end - start + 1 < 10): # 在排序的数组小到一定程度时,使用插入排序 insert_sort(nums, start, end) return # 找到基准数位置,同时调整好数组,使得基准数的左边小于它,基准数的右边都是大于它 pos = get_num_position(nums, start, end) # 递归使用快排,对左边使用快排算法 quick_sort(nums, start, pos - 1) # 对右边元素使用快排算法 quick_sort(nums, pos + 1, end)下面是使用【随机基准+插入排序优化】的测试结果如下:# 有序列表-[随机基准+使用插入排序优化]PS C:\Users\spyinx\Desktop\学习教程\慕课网教程\算法慕课教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/学习教程/慕课网教程/算法慕课教程/code/test_algorithms.pyRunning time: 0:00:00.010962 Seconds# 无序列表-[随机基准+使用插入排序优化]PS C:\Users\spyinx\Desktop\学习教程\慕课网教程\算法慕课教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/学习教程/慕课网教程/算法慕课教程/code/test_algorithms.pyRunning time: 0:00:00.018935 Seconds可以看到这些小技巧在真正大规模数据排序时会有非常明显的效果。更多的优化方法以及测试,读者可以自行去实验和测试,这里就不再继续讲解了。
- 3. 分发糖果 这题是 leetcode 算法部分的135题,难度级别为困难。题目描述如下:老师给孩子们分发糖果,有 N 个孩子站成了一条直线,老师根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果;相邻的孩子中,评分高的孩子必须获得更多的糖果;那么这样下来,老师至少需要准备多少颗糖果呢?示例 1:输入: [1,0,2]输出: 5解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。示例 2:输入: [1,2,2]输出: 4解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这已满足上述两个条件。对于这题,官方给出了 4 种解法,其中解法 2 是使用了贪心算法的思想。现在我们重点介绍下官方的解法 2 以及其贪心点。在解法 2 中,使用两个一维数组 left 和 right。数组 left 用来存储每名学生只与左边邻居有关的所需糖果数。也就是假设规则为:如果一名学生评分比他左边学生高,那么他应该比他左边学生得到更多糖果。类似的,right 数组用来保存只与右边邻居有关的所需糖果数。也就是假设规则为:如果一名学生评分比他右边学生高,那么他应该比他右边学生得到更多糖果。首先,在 left 和 right 数组中,给每个学生 1 个糖果。然后从左向右遍历整个数组,只要当前学生评分比他左邻居高,我们在 left 数组中更新当前学生的糖果数 left[i] = left[i-1] + 1,这是因为在每次更新前,当前学生的糖果数一定小于等于他左邻居的糖果数。接下来用同样的方法从右到左,只要当前学生的评分比他右边(第 i+1 个)学生高,就更新 right[i] 为 right[i] = right[i + 1] + 1。现在,对于数组中第 i 个学生,为了满足题中条件,我们需要给他 max(left[i], right[i]) 个糖果。因此,最后我们得到最少糖果数:最少糖果数 = ∑i=0n−1max(left[i],right[i])\sum^{n-1}_{i=0}max(left[i], right[i])∑i=0n−1max(left[i],right[i]),其中, nn 是评分数组的长度。上述算法在遍历过程中,每一步都尽量少给糖,必须加的时候加一个,这便体现了贪心思想:且在每次选择时,以局部最优为导向,而不考虑此次操作对以后操作的影响。有了上面的题解思路,我们的 Python 的代码就能理解写出,如下:def candy(ratings): # 初始化值 left = [1] * len(ratings) right = [1] * len(ratings) # 从左到右,只要当前学生评分比他左邻居高,则该学生糖果数相比左邻居加1 for i in range(1, len(ratings)): if ratings[i] > ratings[i - 1]: left[i] = left[i - 1] + 1 # 从右到左,只要当前学生评分比他右邻居高,则该学生糖果数相比右邻居加1 for i in range(len(ratings) - 2, -1, -1): if ratings[i] > ratings[i + 1]: right[i] = right[i + 1] + 1 # 最后得到最少糖果数 return sum([max(left[i], right[i]) for i in range(len(ratings))])这里的贪心过程会有些难以理解,需要仔细揣摩。
right相关搜索
-
radio
radiobutton
radiobuttonlist
radiogroup
radio选中
radius
rails
raise
rand
random_shuffle
randomflip
random函数
rangevalidator
rarlinux
ratio
razor
react
react native
react native android
react native 中文