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
运行结果
几个小题
时间: 2024-10-14 14:06:27