【1】各類簡單算法(斐波那契、數組排列、鏈表、圖像旋轉、數組運算)

  • 領域

斐波那契(跳臺階之類)、數組數據排列、數組內部數據處理、圖像旋轉、鏈表等。

  • 應用

借鑑學習總結

  • 代碼
/*
*  main.cpp
*  TestAlgorithm
*  Copyright © 2020 yancey. All rights reserved.
*/
#include <iostream>
#include <vector>
#include <map>
using namespace std;

int main(int argc, const char * argv[]) {
    //
    int numberWay(int n);
    int n = 10;
    int number = numberWay(n);
    cout<<"value:"<<number<<endl;
    //
    vector<int> twoSum(vector<int>&nums, int target);
    vector<int> nums = {1,3,5,8,11,13,15,18};
    int target = 23;
    vector<int> value = twoSum(nums,target);
    for(vector<int>::iterator it = value.begin(); it != value.end(); it++){
        cout<<"value:"<<*it<<endl;
    }
    //
    void rotate (int* martrix, int n);
    void rotate2 (int martrix[][4], int n);
    int a[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    int b[4][4] = {10,9,8,7,6,5,4,3,2,1,0,1,2,3,4,5};
    rotate(*a,4);
    rotate2(b, 4);
    for(int i = 0; i < 4; ++i){
        for(int j = 0; j < 4; ++j){
            cout <<"a[i][j]:"<<a[i][j]<<endl;
            cout <<"b[i][j]:"<<b[i][j]<<endl;
        }
    }
    //
    int removeDuplicates(vector<int>&nums);
    vector<int> x = { 1, 1, 2};
    vector<int> y = { 0,0,1,1,1,2,2,3,3,4 };
    cout<<"len:"<<removeDuplicates(x)<<endl;
    for(vector<int>::iterator it = x.begin(); it != x.end(); it++){
        cout<<"x[i]"<<*it<<endl;
    }
    cout<<"len2:"<<removeDuplicates(y)<<endl;
    for(vector<int>::iterator it = y.begin(); it != y.end(); it++){
           cout<<"y[i]"<<*it<<endl;
       }
    //
    void bubbleSort(int nums[], int n);
    int nu[7] = {3,5,7,4,1,4,10};
    bubbleSort(nu,7);
    for(int i = 0; i < 7; i++){
        cout<<"nu[i]"<<nu[i]<<endl;
    }
    
    
    
    return 0;
}
/*
 *屬性:斐波那契
 *問題描述:一隻青蛙一次可以跳上1級臺階,也可以跳上2級臺階。求該青蛙跳上一個 n 級的臺階總共有多少種跳法?
 *解法:動態規劃
 */
int numberWay(int n)
{
    if(n==0 || n==1){
        return 1;
    }
    int a = 1;
    int b = 1;
    int res = 0;
    for(int i = 2; i <= n; i++){
        res = (a+b)%1000000007;
        a = b;
        b = res;
    }
    return res;
}
/*
 *屬性:數組運算
 *問題描述:給定一個整數數組和一個目標值,找出數組中和爲目標值的兩個數。
 *解法:hash
 */
 vector<int> twoSum(vector<int>&nums, int target)
{
    vector<int> vec;
    map<int, int> dic;
    for(int i=0;i<nums.size();++i){
        dic[nums[i]] = i;
    }
    for(int i=0;i<nums.size();++i){
        if(dic.count(target-nums[i])!=0 && dic[target-nums[i]] != i){
           vec.push_back(i);
           vec.push_back(dic[target-nums[i]]);
           break;
        }
    }
    return vec;
}
/*
 *屬性:數組運算、指針數組、數組指針
 *問題描述:圖像旋轉順時針90度。
 *解法:
 */
void rotate (int* martrix, int n)
{
    for(int layer = 0; layer < n/2; ++layer){
        int first = layer;
        int last = n-1-layer;
        for(int i = first; i<last; ++i){
            int offset = i - first;
            int top = *(martrix + first*n + i);
            //左->上
            *(martrix + first*n + i) = *(martrix + (last-offset)*n + first);
            //下->左
            *(martrix + (last-offset)*n + first) = *(martrix + last*n + (last-offset));
            //右->下
            *(martrix + last*n + (last-offset)) = *(martrix + i*n + last);
            //上->右
            *(martrix + i*n + last) = top;
        }
    }
}
void rotate2 (int martrix[][4], int n)
{
    for(int i = 0; i < (n+1)/2; i++){
        for(int j = 0; j < n/2; j++){
            /*
                     4->3
                     |  |
                     2<-1
             */
            int temp = martrix[n-1-j][i];
            //右下->左下
            martrix[n-1-j][i] = martrix[n-1-i][n-1-j];
            //右上->右下
            martrix[n-1-i][n-1-j] = martrix[j][n-1-i];
            //左上->右上
            martrix[j][n-1-i] = martrix[i][j];
            //左下->左上
            martrix[i][j] = temp;
        }
    }
}
/*
 *問題屬性:數組運算
 *問題描述:給定一個排序數組,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度.
 */
int removeDuplicates(vector<int>&nums)
{
    int len = 0 ;
    if(nums.size() == 0){
        return 0;
    }
    else{
        for(int i = 1; i < nums.size(); i++){
            if(nums[len] != nums[i]){
                nums[++len] = nums[i];
            }
        }
        return len+1;
    }
}
/*
 *問題屬性:排列、冒泡、快速、插入、選擇
 *問題描述:給定亂序數組,進行升序排列
 */
 void bubbleSort(int nums[], int n)
{
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n-i-1; j++){
            if(nums[j] > nums[j+1]){
                int temp = nums[j];
                nums[j] = nums[j+1];
                nums[j+1] = temp;
            }
        }
    }
}
/*
 *
 *
 */

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章