计蒜客第三场
1、有序數組查找
假設一個數組,事先在你未知的情況下,以某一點分段有序排列。比如:(0,0,0,1,2,2,3 變成 0,0,1,2,2,3,0,定需要查找的數,在當前數組中查找,存在,返回ture,不存在,返回false。注意,這次數組中有重復的數字哦~
格式:
第一行輸入數字n,接下來一行輸入數組A[n],數組A[n]滿足題目描述的條件,即分段有序。如:(2, 2, 0, 0, 1, 1);第三行輸入要查找的target值。接下來一行輸出true或者false。
樣例輸入
7 1 2 2 2 0 1 1 0樣例輸出
true #include<iostream> #include<algorithm> using namespace std; int main() {int n;cin>>n;int a[n];for(int i=0;i<n;i++)cin>>a[i]; int target,mid;cin>>target;sort(a,a+n);//對輸入的數組排序int l=0, r=n-1;//二分查找while(r>=l){mid=(l+r)/2;/*if(target==a[mid]){cout<<"true"<<endl;return 0;}*/if(target>a[mid]) l=mid+1;else if(target<a[mid]) r=mid-1;else {cout<<"true"<<endl;return 0;} }cout<<"false"<<endl;return 0; }2、特殊質數
7331是一個特殊的質數,因為我們去掉個位得到的733是一個質數;再次去掉個位得到的73又是一個質數;再去掉個位后得到的7依然是一個質數。對于形似這種的質數,我們稱呼它為特殊質數。
寫一個程序對給定的待求特殊質數的位數 N (1≤N≤8)求出所有對應位數的特殊質數(注意:數字1不被看作一個質數)。
輸入包括一個整數,為待求特殊質數的位數 N。
輸出長度為N的特殊質數列表,每行一個。
#include<iostream> using namespace std; int n; bool IsPrime(int a){for(int i=2;i*i<a;i++){if(a%i==0)return false;}return true; } void dfs(int sum,int cur){if(cur==n)cout<<sum<<endl;for(int i=1;i<=9;i++){if(i%2==0)continue;int asum=sum*10+i;if(IsPrime(asum)){dfs(asum,cur+1);}} } int main(){while(cin>>n){dfs(2,1);dfs(3,1);dfs(5,1);dfs(7,1);}return 0; }?3、顏色排序
給定由n個圖案,圖案是紅色,白色或者藍色其中的一種,開始的時候他們的順序是混亂的。請你設計一種排序算法,使得相同顏色的圖案緊挨著,并且順序為紅,白,藍。? ? 為了方便,這里我們用0, 1, 2分別代替紅白藍三種顏色,請將他們排序出來~? 看這個例子,如:2 2 1 0 1 2 0,排序后變成0 0 1 1 2 2 2? 注意:你不能使用庫函數里面的排序算法哦~? ? 要求:時間復雜度 O(n),空間復雜度 O(1)? ?
格式:? 第一行輸入數字n,第二行輸入A[n], 其中數組里面只包含0, 1, 2三個數。第三行輸出排好序的A[n]? ?
樣例輸入:?
8 1 2 1 2 0 0 0 2
樣例輸出 :
0 0 0 1 1 2 2 2
void SortByN(int a[], int length) {if (a == NULL || length < 0){return;}//重新申請一個數組const int N =200;int b[N];//把新申請的數組全部初始化為0for (int i = 0; i < N; ++i){b[i] = 0;}//遍歷a數組for (int i = 0; i < length; ++i){//例如:a[0] = 10;那么b[key] = b[10] = 1;表示有一個10; a[4] = 10;//那么b[key] = b[10] = 1+1 = 2,表示此時有兩個10;int key = a[i];++b[key];//意思就是b數組里面存放的是a數組中某個元素的個數,b[10]表示在a數//組當中10出現的次數,b[0]表示0在a數組當中出現的次數 }int index = 0;for (int i = 0; i < N; ++i){//如果b[0] = 0;表示a數組當中沒有0;那么不執行這個循環;例如這里a是一個年齡數組,假設最小的年齡是18//那么b[0] -- b[17]都是等于0;那么第二個循環都不執行,第一個循環執行,i加到了18;b[18]=2;//那么a數組當中有兩個18;而且這兩個18就是最小的數字,那么a[0] = 18; a[1] = 18;for (int j = 0; j < b[i];++j){a[index] = i;++index;}} }4、單獨的數字
一個整型數組中有一個元素只出現一次,其它元素都出現兩次。求出只出現一次的元素。
要求:
線性時間復雜度,不能使用額外空間。
聰明的你能搞定嗎?
格式:
第一行輸入數字n,代表有n個數,根據題意,很明顯n是奇數,
第二行輸入數組A[i], i從0~n-1.
最后輸出單獨的數字。
樣例1
輸入:
7
1 3 2 0 3 2 1
輸出:
0?
?5、第一個沒有出現的正數
給定一個數組,從?11?到?nn,找出數組中第一個沒出現的正數。
例如:
給定[1,2,0],則返回?33。
給定[3,4,-1,1],則返回?22。
注意:
算法需要?\mathcal{O}(n)O(n)?的時間復雜度以及線性的空間復雜度。
#include<iostream> using namespace std; int main() {int n;cin>>n;int a[1000001]={0};int tmp;for(int i=0;i<n;i++){cin>>tmp;if(tmp>0) a[tmp]++;}for(int i=1;i<=n;i++){if(a[i]==0){cout<<i;return 0;}} }?
轉載于:https://www.cnblogs.com/geziyu/p/9665777.html
總結
- 上一篇: Java容器---Set: HashSe
- 下一篇: 列表、字典补充点、strJoin方法、s