2024年度总结:成就与挑战并存,与君协同,砥砺前行2025

引言

在这里插入图片描述

非常荣幸入围了 csdnTOP300年度博主的遴选,这也是我第一次入选这么大的比赛,借此机会,想对2024年做一个总结和对2025年的规划

1.命运齿轮转动之刻

时光飞逝,岁月如梭,转眼间已经与csdn相识了7个月,第一篇博客也只是浅浅记录了一下知识点,并没有介绍自己,趁着新年佳节,想弥补一下当初的遗憾,也为自己的未来做好规划

我是一名211大学的大二学生,专业为软件工程,经历了高考的残酷斗争,我只想报复性地玩耍,然而在平淡的大学生活中,危机感始终笼罩着我,学校的课程终究只是纸上谈兵,并不系统化,所以在大一下时,我决定了我要去 学技术做真正的IT人!在注册了csdn账号并发布了第一篇博客后,命运齿轮开始了转动
在这里插入图片描述

梦开始的地方第一篇博客

在这里插入图片描述

2.砥砺前行,不畏艰巨之路

即使有了目标,但道路上的艰巨无一不令人叹息,即使我不再拘泥于拔高绩点,想去探索编程未来的边界,我又如何能跨越荆棘呢?荀子曰:“锲而舍之,朽木不折;锲而不舍,金石可镂。”,坚持,就是普通人的良药。我在csdn成长的道路上就遇到过不少曲折,但在 csdn无数的大佬帮助下,也成功披荆斩棘

1.红与黑的比拼,红黑树与我的相遇

相信对大部分学计算机的大佬们来说,红黑树在结构复杂方面绝对占有一席之地,当时懵懂无知的我遇到它时,只想着打退堂鼓,但 在csdn查阅了相关资料后,自己进行了思考,也逐渐了解了其中的一些奥秘,并尝试着自己写出谜底,红黑树的奇妙结构无一不展示着 编程的魅力与前人的智慧

在这里插入图片描述

我也来重温一下红黑树的插入准则。
约定:cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点

    1. 情况一: cur为红,p为红,g为黑,u存在且为红
      ​​
      ​​在这里插入图片描述
      解决方式:将p,u改为黑,g改为红,然后把g当成cur,继续向上调整。
  • 2.情况二(单旋+变色): cur为红,p为红,g为黑,u不存在/u存在且为黑 (左左和右右
    在这里插入图片描述

细分就是:(1) g->left = p, p->left= cur;左左
(2)g->right=p,p->right=cur;右右

p为g的左孩子,cur为p的左孩子,则进行右单旋转

相反, p为g的右孩子,cur为p的右孩子,则进行左单旋转

p、g变色--p变黑,g变红

  • 3.情况三(双旋+变色): cur为红,p为红,g为黑,u不存在/u存在且为黑 (左右和右左

在这里插入图片描述

细分就是:(1)g->left=p,p->right=cur;左右

(2)g->right=p,p->left=cur;右左

p为g的左孩子,cur为p的右孩子,则针对p做左单旋转

相反, p为g的右孩子,cur为p的左孩子,则针对p做右单旋转

则转换成了情况2!!!!!,然后再用情况2的旋转处理一下就行了
(这点真是异常巧妙,把情况3转换为情况2,可以有效解决新问题)
代码如下:

while (parent&&parent->col == RED)//parent为黑不需要调整,如果cur变成root,parent就不存在退出循环
{
    
    
	node* grandparent = parent->_parent;//祖父一定存在,因为只有根节点是没有祖父的,而根节点一定是黑色的
	if (parent==grandparent->_left)
	{
    
    
		//      g
		//    p   u
		node* uncle = grandparent->_right;  //父亲在左则叔叔在右
		if (uncle && uncle->col == RED)     //情况一.如果叔叔存在且为红色
		{
    
    
			//变色
			parent->col = uncle->col = BLACK;
			grandparent->col = RED;
			//重置cur,parent,继续向上处理
			cur = grandparent;//变为祖父
			parent = cur->_parent;
		}
		else //叔叔不存在或为黑色,旋转加变色
		{
    
    
			//   g
			//  p
			// c

			if (cur == parent->_left)  //情况二.单旋
			{
    
    

				rotateR(grandparent);
				parent->col = BLACK;
				grandparent->col = RED;
			}

			//   g
			//  p
			//   c

			else      //情况三.cur==parent->_right,双旋
			{
    
    
				rotateL(parent);//经历一次左旋后变成情况二!!!!!!!!!!!(cur和parent换位置)
				rotateR(grandparent);
				cur->col = BLACK;
				grandparent->col = RED;
			}

			break;//调整一次就结束了,所以经历过旋转后不需要重置cur,parent,grandparent
		}
	}
	else
	{
    
    
		//      g
		//    u   p
		//
		node* uncle = grandparent->_left;  //父亲在右则叔叔在左
		if (uncle && uncle->col == RED)
		{
    
    
			parent->col = uncle->col = BLACK;
			grandparent->col = RED;
			//
			cur = grandparent;
			parent = cur->_parent;
		}
		else
		{
    
    
			//    g
			//  u   p
			//        c
			if (cur == parent->_right)
			{
    
    
				rotateL(grandparent);
				parent->col = BLACK;
				grandparent->col = RED;
			}
			else
			{
    
    
				//   g
				// u   p
				//    c
				rotateR(parent);
				rotateL(grandparent);
				cur->col = BLACK;
				grandparent->col = RED;

			}
			break;//调整一次就结束了,所以经历过旋转后不需要重置cur,parent,grandparent
		}
	}

每次重新复盘,都有不一样的收获

2.过往与未来的相遇,回溯时光的震撼

在学完了数据结构和部分c++内容后,我开始尝试接触算法题,每次做不出题时的 焦虑与烦躁,都会在完成解题后化作 酣畅与喜悦,这里我也要感谢csdn平台,很多次在我手足无措时,只要点开csdn,就有无数大佬发布他们自己的解题思路,很多次都使迷茫的我瞬间醍醐灌顶

在这里插入图片描述
虽然目前只写了80多道题,但我还会继续加油滴

其中最令我印象深刻的就是不同路径|||啦,让我真正感受到递归的魅力。

在这里插入图片描述

这个题就是走迷宫的类型,对于第一次,没学过任何算法的我,写了40多分钟才完成,可以说是里程碑的一题,csdn大佬的回溯入门文章也给了我很大的启发,希望我之后也能写出自己的迷宫小游戏。

class Solution {
    
    
public:

int num=0;
int row=0;
int line=0;


bool judge(vector<vector<bool>>&check)
{
    
    
    for(int i=1;i<row+1;i++)
        {
    
    
           for(int j=1;j<line+1;j++)
           {
    
      
               if(check[i][j]==false)//有格子没走过
               return false;
           }
        }
    return true;//所有格子都走过
}




void dfs(vector<vector<int>>& square,int i,int j,vector<vector<bool>>&check)
{
    
    
       if(square[i][j]==2)  //走到终点
       {
    
    
            if(judge(check))
            {
    
    
                num++;  //路径数量++;
            }
       }


       if((square[i][j+1]==0||square[i][j+1]==2)&&!check[i][j+1])//判断右
       {
    
    
          check[i][j+1]=true;
          dfs(square,i,j+1,check);
          check[i][j+1]=false;//恢复现场
       }

       if((square[i][j-1]==0||square[i][j-1]==2)&&!check[i][j-1])//判断左
       {
    
    
          check[i][j-1]=true;
          dfs(square,i,j-1,check);
          check[i][j-1]=false;//恢复现场
       }

       if((square[i+1][j]==0||square[i+1][j]==2)&&!check[i+1][j])//判断下
       {
    
    
          check[i+1][j]=true;
          dfs(square,i+1,j,check);
          check[i+1][j]=false;//恢复现场
       }



       if((square[i-1][j]==0||square[i-1][j]==2)&&!check[i-1][j])判断上
       {
    
    
          check[i-1][j]=true;
          dfs(square,i-1,j,check);
          check[i-1][j]=false;//恢复现场
       }

}


    int uniquePathsIII(vector<vector<int>>& grid) {
    
    
        row=grid.size();
        line=grid[0].size();
        int position_row=0;
        int position_line=0;
        vector<vector<bool>>check(row+2,vector<bool>(line+2,false));
        vector<vector<int>>square(row+2,vector<int>(line+2,3));

        for(int i=1;i<row+1;i++)
        {
    
    
           for(int j=1;j<line+1;j++)
           {
    
    
               square[i][j]=grid[i-1][j-1];
               if(square[i][j]==1||square[i][j]==-1)
               {
    
    
                    if(square[i][j]==1)
                    {
    
    
                        position_row=i;//找入口的行
                        position_line=j;//找入口的列
                    }
                    check[i][j]=true; //
               }
           }
        }
     

     dfs(square,position_row, position_line,check);
     return num;
    }
};

3.漫漫长路,沿途总有收获之时

在csdn发文7个月,也第一次迎来了我的年度报告(嘻嘻)
在这里插入图片描述
一年的旅行,让我收获颇丰,我与csdn共奋战!
在这里插入图片描述

一年的努力,让我收获了10033次点赞,5477次评论,8002次收藏,476次代码分享,也成功获得了 c++领域新星创作者的身份

在这里插入图片描述
我也在1024征文活动中得到了属于自己的第一份实体回报:

在这里插入图片描述

在其他社区中也取得了一点点小成就:
在这里插入图片描述

2024年已经画上了句号,回望过去的一年,虽然充满了挑战,但也让我收获了成长与启示。每一次的跌倒都成就了更加坚韧的我,每一份努力都为新的一年奠定了坚实的基础。感谢过去一年的所有经历,它们塑造了今天的我。随着2025年的到来,我将继续以更加坚定的步伐,走向更加广阔的天地。

愿新的一年里,我们都能带着对生活的热爱和对未来的期待,勇敢前行,创造属于自己的辉煌,与csdn平台一起奋斗