DataWhale算法入门与数组篇-学习笔记day1~2

        题主是大二学生,第一次参与DataWhale的学习小组。对于一个大一只学了C语言,毫无任何专业课,甚至不是上机考的普通学生…其实对于程序也是一知半解了,写这个笔记可以说是完全小白。给同情况的朋友们做个参考,希望能帮到大家。

01  程序

ac5adcd973d24361be3637ad73a98a38.jpg 图中是Pascal语言之父的一本非常著名的书,同时也算是程序的本质了。

通俗地讲,程序就是码农噼里啪啦的一串代码。谁都见过。

但要专业一点来说,程序看成小恐龙,那数据结构就是骨架,算法就是皮肉了。

以数据的计算机表示和一系列操作搭骨架,用不同的思路方法做皮肉。就好像同种的小恐龙们🦕骨架都长得大差不差,如果要捕食就得长爪子长嘴,要跑路就得长脚长腿,这就是各种数据结构。那算法呢,有的小恐龙是尖嘴,有的是扁嘴,但总之都能吃到东西,效率和适用不同,这就是不同的算法了。

02 数据结构分类

按【逻辑结构】

分集合、线性、树形、图形结构。见词知意,这表征数据元素之间的不同关系联系。

按【物理结构】

分顺序和链式存储结构。这是针对计算机存储数据而言的。

可以这样形象理解,顺序是一条大贪吃蛇,链式是很多条小蛇,咬着前一条尾巴连成一长条大蛇。其优劣也就显而易见了。

03 算法

我们常听到'优化算法'这一说法。那怎样算是优化呢?

答案是:要么运行时间更短了,要么占用空间更小了。

两者兼顾自然更好,但现实问题往往会有计算量过大而导致运行时间过高,或者循环次数太多了导致空间不够溢出了。

所以常常是【空间换时间】【时间换空间】以达到正常运行的目的。

04 算法复杂度

时间复杂度

也即算法里耗时最长那一部分花费的时间。用O()表示。

普通赋值,加减乘除等运算,都算O(1);循环运算i次,为O(n);嵌套循环i和j次,为O(j的i次方次)……等等

如果考虑循环中有break语句,即最短可能O(1),最长可能O(n),那此时就要求平均时间复杂度了。

空间复杂度

也即算法占用存储空间的大小,用O()表示,分为[局部变量占用内存]和[递归使用堆栈空间]

同样,常数运算复杂度为O(1),递归调用等线性的为O(n)。

(题主还不懂堆栈和递归调用这样,先简写略过……)

05 LeetCode入门

LeetCode,中文:力扣,简单说就是刷题平台,更具体地~刷算法题平台。

刷题之前,还是、一定先学算法和数据结构,像题主这种不自量力就一头撞上去的,死得很惨。

本来大家就是忙里挤时间,错误的方法简直煎熬到地狱难度!所以提前要有知识储备,开始时候也不要只想着自己敲代码,盯了五分钟还没有思路,不妨就去看看答案。毕竟连1+1都没有概念,直接就来四则运算;连猫都没见过就想画虎,那也是不可能的啊~

06 练习题

1(2235)两整数相加

#include<stdio.h>
int main()
{
    int a,b,s;
    scanf("num1=%d,num2=%d",&a,&b);
    s=a+b;
    printf("%d",s);
    return s;
}

2(1929)数组串联

class Solution {
public:
    vector<int> getConcatenation(vector<int>& nums) {
        int n=nums.size();
        vector<int> a[2*n];
        for(int i=0;i<n;i++)
        {
            if(i<n)
           a[i]=nums[i];
            else
            a[i]=nums[i-n];
        }
        
        return a;
    }
};

3(771)宝石与石头

class Solution {
public:
    int numJewelsInStones(string jewels, string stones) {
        int sum=0;
        int jl=jewels.length();
        int sl=stones.length();
        for(int i=0;i<sl;i++)
        {
            char st=stones[i];
            for(int j=0;j<jl;j++)
            {
                char je=jewels[j];
                if(je==st)
                {
                    sum++;
                    break;
                }
            }
        }
        return sum;
    }
};

4 (1480)  一维数组动态和

class Solution {
public:
    vector<int> runningSum(vector<int>& nums) {
        int n=nums.size();
        // vector<int> tmp[n];
        // for(int i=0;i<n;i++)
        // tmp[i]=nums[i];
        for(int i=1;i<n;i++)
        {
        //    for (int j=0;j<i;j++)
        //    {
        //        nums[i]+=nums[j];
        //    }
            nums[i]+=nums[i-1];
        }
        return nums;
    }
};

忽略我的一堆注释,其实是很简洁的一个办法嘿嘿嘿!

5(0709)转换成小写字母

class Solution {
public:
    string toLowerCase(string s) {
        int n=s.length();
        for(int i=0;i<n;i++)
        {
            if(s[i]>64&&s[i]<91)
            s[i]+=32;
        }
        return s;


    }
};

哈哈哈,deadline的时候果然效率是最高的!不然这种题我都想不出来,现在就是简单粗暴但顶用哈哈哈

6(1672)最富有客户的资产总量

class Solution {
public:
    int maximumWealth(vector<vector<int>>& accounts) {
        int max=accounts[0][0];
       // int i=0;
        int m=accounts.size();//i
        int n=accounts[0].size();//j
        for (int i=0;i<m;i++)
        {
            for (int j=1;j<n;j++)
            {
                accounts[i][0]+=accounts[i][j];
            }
        }
        for (int i=0;i<m;i++)
        {
            if(max<accounts[i][0])
            {
                max=accounts[i][0];
            }
        }

        return max;

    }
};

一天天的满课真是… 就写到这里吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值