【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;
            }
        }
    }
}
/*
 *
 *
 */

 

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