首页 > 代码库 > 几个小题

几个小题

 

1、从一个数值连续的数组中,抽调n个元素,查找抽调的是哪几个

#include "stdafx.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){    int a[100] = {0};  //抽掉3, 4, 57    int b[100] = {0};  //原始数组, [0, 99]    for (int i = 0; i < sizeof(a) / sizeof(a[0]); ++ i)    {        if (i > 2 && i < 55)             a[i] = i + 2;         else if (i >= 55)              a[i] = i + 3;         else             a[i] = i;         b[i] = i;    }     const int N = 3;    int arr[N] = {0};    int nIndex = 0;    int k = 0;    int j = 0;    for ( k = 0,   j = 0;         k < (sizeof(a) / sizeof(a[0]) - N) && j < sizeof(b) / sizeof(b[0]); ++ j)    {        if (a[k] != b[j])             arr[nIndex++] = b[j];         else            ++ k;        if (sizeof(arr) / sizeof(arr[0]) == nIndex)             break;     }    cout<<"\n打印被抽调的值\n";    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++ i)        cout << arr[i] <<endl;    return 0;}

 

 

 

运行结果

 

 

 

 

2、一个数组a[n + 1], 元素的值域为[1, n],找出任意一个重复的元素

#include "stdafx.h"#include <iostream>using namespace std;/************************************************************************//* int型数组arr[n + 1], 数组元素的值域为[1, n]求任意重复的数字思路:先快排, O(nlogn), 然后从头遍历,找到第一个a[i] == a[i +1]的即为第一个重复的最小(大)值元素/************************************************************************/int Partition(int arr[], int low, int high){     int i = low;    int j = high;    int priovt = arr[i];      while(i < j)    {         //从右边找第一个小于privot的元素,将其放在low的位置        while(i < j && arr[j] >= priovt)  --j;          if(i < j)            arr[i] = arr[j];        //从左边找第一个大于privot的元素,将其放在high的位置        while(i < j && arr[i] <= priovt) ++ i;        if(i < j)            arr[j] = arr[i];      }    arr[i] = priovt;    return i; }void QuickSort(int arr[], int low, int high){    if(NULL == arr)        return;         if (low < high)    {        //分成两部分        int nPos = Partition(arr, low, high);          QuickSort(arr, low, nPos - 1);        QuickSort(arr, nPos + 1, high);      } }int _tmain(int argc, _TCHAR* argv[]){    //arr有6 + 1个元素, 值域为[1, 6]    int arr[] = {3, 1, 2, 4, 5, 6, 3};    int size = sizeof(arr) / sizeof(arr[0]);    QuickSort(arr, 0, size - 1);    cout << "\n打印排序之后的值\n";    for (int i = 0; i < size; ++i)    {        cout << arr[i] << endl;    }    cout << "\n开始从头遍历,直到找到第一个重复的\n";    for (int i = 0; i < size - 1; ++ i)        if(arr[i] == arr[i + 1])        {            cout << "\n第一个重复的元素为: " << arr[i] << endl;            break;        }    cout << endl << endl;          return 0;}

 

 

 

运行结果

 

 

3、表如下, 找出日期在2014年8月2日以后,操作次数超过(含)3次的用户

 

 select * from (  select usr, count(usr) as times from tbl_users where dt>2014-08-02  group by usr ) t   where times >= 3  

 

 

 

运行结果