题主是大二学生,第一次参与DataWhale的学习小组。对于一个大一只学了C语言,毫无任何专业课,甚至不是上机考的普通学生…其实对于程序也是一知半解了,写这个笔记可以说是完全小白。给同情况的朋友们做个参考,希望能帮到大家。
01 程序
图中是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;
}
};
一天天的满课真是… 就写到这里吧。