第一周練習(xí)——認(rèn)識(shí)復(fù)雜度和簡(jiǎn)單排序算法-創(chuàng)新互聯(lián)

前言:
👏作者簡(jiǎn)介:我是笑霸final,一名熱愛技術(shù)的在校學(xué)生。
📝個(gè)人主頁:個(gè)人主頁1 || 笑霸final的主頁2
📕系列專欄:《數(shù)據(jù)結(jié)構(gòu)與算法》
📧如果文章知識(shí)點(diǎn)有錯(cuò)誤的地方,請(qǐng)指正!和大家一起學(xué)習(xí),一起進(jìn)步👀
🔥如果感覺博主的文章還不錯(cuò)的話,👍點(diǎn)贊👍 + 👀關(guān)注👀 + 🤏收藏🤏

創(chuàng)新互聯(lián)建站是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶提供優(yōu)質(zhì)的成都天府聯(lián)通服務(wù)器托管服務(wù)

在這里插入圖片描述

請(qǐng)?zhí)砑訄D片描述

目錄
  • 隨堂習(xí)題-排序(冒泡排序)
  • 隨堂習(xí)題-排序(選擇排序)
  • 隨堂習(xí)題-排序(插入排序)
  • 隨堂習(xí)題-二分查找某數(shù)
  • 隨堂習(xí)題-查找某個(gè)位置
  • 隨堂習(xí)題-局部最小值問題
  • 隨堂習(xí)題-一個(gè)數(shù)出現(xiàn)奇數(shù)次
  • 隨堂習(xí)題-兩個(gè)數(shù)出現(xiàn)奇數(shù)次
  • 隨堂習(xí)題-(遞歸)數(shù)組中的大值

隨堂習(xí)題-排序(冒泡排序)

給你一個(gè)n代表有n個(gè)數(shù)字,給出這n個(gè)數(shù)字,然后你需要使用冒泡排序?qū)⑦@些數(shù)字從小到大排好。

輸入描述:

第一行輸入一個(gè)n,代表有n個(gè)數(shù)字
第二行輸入n個(gè)數(shù)

輸出描述:

輸出排序好后的n個(gè)數(shù)


示例1
輸入:

4
4 3 2 1

輸出:

1 2 3 4

代碼

#include#includeusing namespace std;
int main(){int n=0;
    cin>>n;
    if(n<=0) return 0;
    vectornums(n);
    for(int i=0;icin >>nums[i];
    }
    //冒泡
    for(int i=n-1;i>0;i--){for(int j=0;jif(nums[j]>nums[j+1]){nums[j]  =nums[j] ^ nums[j+1];
                nums[j+1]=nums[j] ^ nums[j+1];
                nums[j]  =nums[j] ^ nums[j+1];
            }
        }
    }
    //輸出
     for(int i=0;icout<< nums[i]<<" ";
    }
    return 0;
}
隨堂習(xí)題-排序(選擇排序)

給你一個(gè)n代表有n個(gè)數(shù)字,然后你需要使用選擇排序?qū)⑦@些數(shù)字從小到大排好。
輸入描述:

第一行輸入一個(gè)n,代表有n個(gè)數(shù)字
第二行輸入n個(gè)數(shù)

輸出描述:

輸出排序好后的n個(gè)數(shù)


示例1
輸入:

4
4 3 2 1

輸出:

1 2 3 4

代碼

#include#includeusing namespace std;
int main(){int n=0;
    cin>>n;
    if(n<=0) return 0;
    vectornums(n);
    for(int i=0;icin >>nums[i];
    }
    //選擇排序
    
    for(int i=0;iint vauleMinIndex=i;
        for(int j=i+1;jif(nums[vauleMinIndex]>=nums[j]){vauleMinIndex=j;
            }
        }
        swap(nums[i], nums[vauleMinIndex]);
    }
    //輸出
     for(int i=0;icout<< nums[i]<<" ";
    }
    return 0;
}
隨堂習(xí)題-排序(插入排序)

給你一個(gè)n代表有n個(gè)數(shù)字,然后你需要使用插入排序?qū)⑦@些數(shù)字從小到大排好。
輸入描述:

第一行輸入一個(gè)n,代表有n個(gè)數(shù)字
第二行輸入n個(gè)數(shù)

輸出描述:

輸出排序好后的n個(gè)數(shù)


示例1
輸入:

4
4 3 2 1

輸出:

1 2 3 4

代碼

#include#includeusing namespace std;
int main(){int n=0;
    cin>>n;
    if(n<=0) return 0;
    vectornums(n);
    for(int i=0;icin >>nums[i];
    }
    //插入排序
    for(int i=0;ifor(int j=1;jif(nums[j]swap(nums[j],nums[j-1]);
            }
        }
    }
    //輸出
     for(int i=0;icout<< nums[i]<<" ";
    }
    return 0;
}
隨堂習(xí)題-二分查找某數(shù)

給你一個(gè)n代表有一個(gè)長(zhǎng)度為n的有序數(shù)組,然后給你一個(gè)k,你需要判斷這個(gè)k是否在數(shù)組里面,
如果存在就返回這個(gè)數(shù)從左往右第一次出現(xiàn)位置的下標(biāo),如果不存在輸出-1。
輸入描述:

第一行輸入一個(gè)n,k,其中n代表有n個(gè)數(shù)字,k代表你需要查找的元素
第二行輸入n個(gè)數(shù)

輸出描述:

如果在數(shù)組里面找到了k,輸出k所在的下標(biāo)(注:如果數(shù)組中k出現(xiàn)了多次,請(qǐng)輸出最小的下標(biāo)?。?,如果k不在,就輸出-1


示例1
輸入:

7 0
0 1 2 3 4 5 6

輸出:

0

代碼

#include#includeusing namespace std;
int main(){int n=0,k=-1,tep=-1;
    cin>>n;cin>>k;
    if(n<=0) return 0;
    vectornums(n);
    for(int i=0;i>nums[i];
    
    for(int i=0;i//插入排序
        for(int j=1;jif(nums[j]//交換兩個(gè)數(shù)
                nums[j]  = nums[j] ^ nums[j-1];
                nums[j-1]= nums[j] ^ nums[j-1];
                nums[j]  = nums[j] ^ nums[j-1];
            }
        }
    }
   //二分查找
    int l=0,r=n-1;
    while(l<= r){int mid = l + ((r -l ) >>1);
        if(nums[mid]<  k) l=mid+1;
        if(nums[mid] >k) r=mid-1;
        if(nums[mid] == k){//查重
            if(nums[mid-1]< nums[mid]){tep = mid;
            }
             r= mid-1;
        }
    }
    cout<
隨堂習(xí)題-查找某個(gè)位置

你需要輸入一個(gè)n,一個(gè)數(shù)k,然后輸入一個(gè)長(zhǎng)度為n個(gè)大小的數(shù)組arr,然后你需要在arr上找滿足>=K的最左位置,并且輸出這個(gè)位置,如果不存在這個(gè)位置就輸出-1。
輸入描述:

第一行輸入一個(gè)n,k
第二行輸入長(zhǎng)度為n個(gè)大小的數(shù)組arr

輸出描述:

輸出>=K的最左位置


示例1
輸入:

5 1
0 0 2 4 6

輸出:

2

代碼

#include#includeusing namespace std;
int main(){int n=0,k=-1,tep=-1;
    cin>>n;cin>>k;
    if(n<=0) return 0;
    vectornums(n);
    for(int i=0;i>nums[i];
    
    for(int i=0;i//插入排序
        for(int j=1;jif(nums[j]//交換兩個(gè)數(shù)
                nums[j]  = nums[j] ^ nums[j-1];
                nums[j-1]= nums[j] ^ nums[j-1];
                nums[j]  = nums[j] ^ nums[j-1];
            }
        }
    }
   //二分查找
    int l=0,r=n-1;
    while(l<= r){int mid = l + ((r -l ) >>1);
        if(nums[mid]<  k) l=mid+1;
        if(nums[mid] >k){r=mid-1;
            tep=mid;
        } 
        if(nums[mid] == k){tep=mid;
            //查重
            if(nums[mid-1] >nums[mid]){tep = mid;
            }
             r= mid-1;
        }
    }
    cout<
隨堂習(xí)題-局部最小值問題

定義局部最小的概念。arr長(zhǎng)度為1時(shí),arr[0]是局部最小。arr的長(zhǎng)度為N(N>1)時(shí),如果arr[0]< arr[1],那么arr[0]是局部最?。?br />如果arr[N-1] 是局部最小。給定無序數(shù)組arr,已知arr中任意兩個(gè)相鄰的數(shù)都不相等,只需要返回arr中任意一個(gè)局部最小出現(xiàn)的位置即可,如果不存在這個(gè)位置就輸出-1。

輸入描述:

第一行輸入一個(gè)n代表下面需要輸入n個(gè)數(shù)
第二行輸入n個(gè)元素,任意兩個(gè)相鄰的數(shù)都不相等

輸出描述:

返回arr中任意一個(gè)局部最小出現(xiàn)的位置


示例1
輸入:

6
6 2 3 1 5 6

輸出:

1

代碼

#include#includeusing namespace std;
int main(){int n=0;
    cin>>n;
     if(n<=0) { cout<< -1<< endl;
        return 0;
    }
    vectornums(n);
    for(int i=0;i>nums[i];
   
    //開頭局部最小
   if(n==1 || nums[0]< nums[1]){cout<< 0<< endl;
        return 0;
   }
    if(n==2 && nums[0]>nums[1]){cout<< 1<< endl;
        return 0;
    }
    //末尾局部最小
    if (nums[n-1]< nums[n-2]){cout<< n - 1<< endl;
        return 0;
    }
   //二分查找
    int l=0,r=n-1;
    while(l<= r){int mid = l + ((r -l ) >>1);
        if(nums[mid]< nums[mid-1] && nums[mid]cout<< mid<< endl;
            return 0;
        }
        else if( nums[mid]//說明mid+1也小于于mid  所以局部最小值應(yīng)該在右邊
            l=mid+1;
        }
        else  r=mid-1;
    }
    cout<<-1;
    return 0;
}
隨堂習(xí)題-一個(gè)數(shù)出現(xiàn)奇數(shù)次

一個(gè)數(shù)組中有一種數(shù)出現(xiàn)了奇數(shù)次,其他數(shù)都出現(xiàn)了偶數(shù)次,怎么找到這一個(gè)數(shù)?

輸入描述:

第一行輸入一個(gè)n代表,有個(gè)n個(gè)長(zhǎng)度大小的數(shù)組
第二行輸入一個(gè)長(zhǎng)度為n的數(shù)組

輸出描述:

輸出這個(gè)數(shù)組中出現(xiàn)奇數(shù)次的數(shù)


示例1
輸入:

5
1 1 1 2 1

輸出:

2

代碼

#includeusing namespace std;
 int main(){ int n=0;
     cin>>n;
     if(n<=0){ cout<<-1;
         return 0;
     }
     vectorarr(n);
     for(int i=0;i>arr[i];
     
     int x=0;
     for(int i=0;i x=x^arr[i];
     }
     cout<< x<
隨堂習(xí)題-兩個(gè)數(shù)出現(xiàn)奇數(shù)次

給定一個(gè)數(shù)字arr,其中只有兩個(gè)數(shù)字出現(xiàn)了奇數(shù)次,其它數(shù)字都出現(xiàn)了偶數(shù)次,按照從小到大順序輸出這兩個(gè)數(shù)。

輸入描述:

第一行輸入一個(gè)n,
第二行輸入n個(gè)數(shù)

輸出描述:

輸出出現(xiàn)奇數(shù)次的兩個(gè)數(shù),按照從小到大的順序。


示例1
輸入:

4
1 1 2 3

輸出:

2 3

代碼

#includeusing namespace std;
 int main(){ int n=0;
     cin>>n;
     if(n<=0){ cout<<-1;
         return 0;
     }
     vectorarr(n);
     for(int i=0;i>arr[i];
     //如果所有的數(shù)異或運(yùn)算 最后的值一定是出現(xiàn)奇數(shù)次的兩個(gè)數(shù)的異或 并且一定不為0 
     //例如1111 和 1000 他們異或 為 0111
     int eor=0;
     
     for(int i=0;i //把和rightOne位置同為1的數(shù)異或 那么得到的數(shù)就是其中的一個(gè)答案
        if( (rightOne & arr[i]) != 0){onlyOne ^= arr[i];
        }
     }
    int y= eor^onlyOne;
        if(onlyOne  cout<< onlyOne<<" "<< y;
        }else{ cout<< y<<" "<< onlyOne;
        }
     return 0;
 }
隨堂習(xí)題-(遞歸)數(shù)組中的大值

用遞歸方法找一個(gè)數(shù)組中的大值

輸入描述:

第一行輸入一個(gè)n,代表數(shù)組的長(zhǎng)度
第二行,輸入n個(gè)數(shù)

輸出描述:

輸出這個(gè)數(shù)組中的大值


示例1
輸入:

5
1 2 3 4 5

輸出:

5

代碼

#include#includeusing namespace std;

//遞歸
int myMax(int arr[],int l,int r){if(l==r){return arr[l];
    }
    int mid=l+((r-l)>>1);
    int leftmax=myMax(arr,l,mid);
    int rightmax=myMax(arr,mid+1,r);
    return leftmax >rightmax ? leftmax : rightmax;
}

int main(){int n;
    cin>>n ;
    if(n<=0) return 0;
     int *arr = new int[n];
    //vectorarr(n);
    for(int i = 0 ;i< n ; i++){cin>>arr[i];
    }
    cout<< myMax(arr,0,n-1);
    return 0;
}

注意
上述例題來自牛客網(wǎng) https://www.nowcoder.com/

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁標(biāo)題:第一周練習(xí)——認(rèn)識(shí)復(fù)雜度和簡(jiǎn)單排序算法-創(chuàng)新互聯(lián)
分享鏈接:http://muchs.cn/article24/dpepje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)微信小程序、App開發(fā)網(wǎng)站內(nèi)鏈、關(guān)鍵詞優(yōu)化、微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)