sql求倒数第二大的数,效率不高,但写法新颖

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication9
{
    class Program
    {
        static void Main(string[] args)
        {    //          sql如下,我把它翻译成代码,加深理解
    //            SELECT MAX(id)FROM sys_menu E1
    //           WHERE
    //          (SELECT COUNT(DISTINCT(E2.id)) FROM sys_menu E2
    //           WHERE E2.id > E1.id
    //            ) = 1; --9990

            List<int> list = new List<int> { 1, 2, 3, 55, 66 };
            int max = 0;
            foreach (var id1 in list)
            {

                int count = 0;
                var dic = new Dictionary<int, int>();
                foreach (var id2 in list)
                {
                    if (!dic.ContainsKey(id2))
                    {
                        if (id2> id1)
                        {
                            count++;
                        }
                        dic[id2] = 1;
                    }

                }
                //上面的代码说明id2>id1那么id1就不可能是最大的,并且比id1大的要求只能有一个,那么说过成语吧一人之下,万人之上 (注意这个至少要2个元素才有意义)
                //所以也说明上面的sql有个陷阱SELECT MAX(id) 改为 select id也是可以的, 但其实max也是为了没有记录的时候返回一个空值
                if (count != 1)
                {
                    continue;
                }

                if (max == 0)
                {
                    max = id1;
                }
                else if (id1> max)
                {
                    max = id1;
                }

            }
            Console.WriteLine(max);
            Console.Read();
        }
    }
}

原文地址:https://www.cnblogs.com/kexb/p/9265451.html

时间: 2024-10-15 02:24:23

sql求倒数第二大的数,效率不高,但写法新颖的相关文章

求数组第二大的数(选择排序)

定义一个最大 和第二大的数 每次循环都判断数组中是否有比最大的数大的有则交换两者的值同时 把原来最大数的值赋值给第二大的 public class SecondMax { public static int FindSecMax(int[] data) { int count = data.length; int maxnumber = data[0]; int sec_max = Integer.MIN_VALUE; for(int i = 1;i<count;i++) { if(data[i

求出整形数组中第二大的数的值

1 int findsecond(int a[], int size) 2 { 3 int max = a[0]; 4 int second = a[1]; 5 int index = 0; 6 for (int i = 0; i < size; ++i) 7 { 8 if (max < a[i]) 9 { 10 second = max; 11 index = i; 12 max = a[i]; 13 } 14 else if (max > a[i]) 15 { 16 if (seco

面试算法题:16个数,最多用20次比较,找出第二大的数?

这道题最笨的方法就是先从16个数中选出最大的数,然后再从剩下的15个数中选出最大数就可得到答案,因此,需要15+14=29次比较. 既然这道题要求在20次比较之内就能找出第二大的数,那我们就想能简单的方法. 假设16个数中最大的是A,第二大的是B. 首先将16个数两两进行比较,较大者胜出,然后再在胜出者中进行两两比较,按此方法,最后选出最大数A,如下所示 红色路线是最大数经过的路径. 接下来分析B可能存在的位置. 将16个数分为左部分和右部分各8位: 1.如果A和B在两个不同的部分(A在左部分,

《数据结构与算法分析:C语言描述》读书笔记------练习1.1 求第K大的数

求一组N个数中的第k个最大者,设k=N/2. 1 import java.util.Random; 2 3 4 public class K_Max { 5 6 /** 7 * @param args 8 */ 9 //求第K大的数,保证K大于等于1,小于等于array.length/2哦 10 public static int TopK(int array[],int K) 11 { 12 int topk[] = new int [K]; 13 for(int i = 0; i<topk.

如何找出数组中第二大的数

1.最容易想到的办法 我们可以用最简单的办法来找到一个数组中任意大小的数字,那就是按照某一个排序方式将数组的所有元素进行排序,然后按需取出来就可以,知识这种方式的时间复杂度和空间复杂度比较大,所以,有了下面这种方式 2.通过设置两个变量来进行判断 这种方式可以只通过一遍扫描数组即可找到第二大数,具体的形式如下:先定义两个变量:一个变量用来存储数组的最大数,初始值为数组首元素,另一个变量用来存储第二大的数,初始值为最小负整数,然后遍历数组元素,如果数组元素的值比最大数变量还大,更新最大数:若数组元

普林斯顿公开课 算法3-2:求第k大的数

问题 给定N个元素的数组,求第k大的数. 特例 当k=0时,就是求最大值,当k=N-1时,就是求最小值. 应用 顺序统计 求top N排行榜 基本思想 使用快速排序方法中的分区思想,使得a[k]左侧没有更小的数,右侧没有更大的数 性能 快速选择算法的复杂度是N. 最坏情况下的复杂度是1/2N^2,但是可以通过预先洗牌来防止出现最坏情况 代码 public class QuickSort { // 对区间 [start, end) 进行分区 public static int partition(

【优先队列-求第Ki大的数】Black Box

Black Box Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8637   Accepted: 3542 Description Our Black Box represents a primitive database. It can save an integer array and has a special i variable. At the initial moment Black Box is empt

python找出数组中第二大的数

#!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:找出数组中第2大的数字 ''' def find_Second_large_num(num_list):   '''''   找出数组中第2大的数字   '''   #直接排序,输出倒数第二个数即可   tmp_list=sorted(num_list)   print 'Second_large_num is:', tmp_list[-2]   #设置两个标志位一个存储最

poj 2886 Who Gets the Most Candies? 线段树动态求第k大的数

题意: n个小孩站一圈,每个小孩拿一个数字,从第k个孩子开始出局,然后下一个出局的孩子是刚刚出局的孩子之前或之后第v个(刚刚出局的孩子的数字是+v则之后v个,-v则之前v个),这样所有孩子终将出局,第p个出局的孩子得f(p)分,f(p)定义为p的因子个数.求分数最高的孩子. 分析: 设顺时针为正方向,关键是模拟出每次出局的孩子是剩下的孩子中的正方向的第几个,设当前要出局的是第k个,然后要求出第k个小孩的下标(pos)以便下一次计算下一个出局的孩子是第几个,这些步骤可用线段树维护. 代码: //p