Challenge & Growth —— 从这里开始

Posted zufezzt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Challenge & Growth —— 从这里开始相关的知识,希望对你有一定的参考价值。

做有挑战的事情,就从这里开始。

 

忘记这本书现在在哪儿了,以前还以为能祖祖辈辈留传,现在只能借助 Nowcoder 了。Now coder,Forever thinker。

 

想以自以为最优美的 code 来体现算法与数据结构的美。

 

题目:二维数组中的查找

题解:拿左下角 $(rowCount - 1, 0)$ 为起点,如果 $target >a[i][j]$,那么第 $0$ 列就无效了,小于的话,最后一行就无效了,就这样每次删除一行或者一列。

时间复杂度:$O(n + m)$

注意:这题最暴力的做法是 $O(n*m)$ 遍历整个二维数组;稍微优雅的是枚举行,二分列,这样是 $O(n * logm)$

代码:

class Solution 
public:
    bool Find(int target, vector<vector<int> > array) 
      if(array.size() == 0) 
        return false;
      
      
      int rowCount = array.size();
      int colCount = array[0].size();
      
      int i = rowCount - 1;
      int j = 0;
      
      while(i >= 0 && j < colCount) 
        if(array[i][j] == target) 
          return true;
        
        
        array[i][j] > target ? i -- : j ++;
      
      
      return false;
    
;

 

题目:替换空格

题解:这题目正着来的话必然需要开辟新的字符数组去存储结果,可以倒着考虑,计算好新数组的长度,倒着更新就可以了。

时间复杂度:$O(length + spaceCount * 2)$

注意:不喜欢 if else 了,三目运算符瞎用

代码:

class Solution 
public:
	void replaceSpace(char *str,int length) 
      int spaceCount = 0;
      for(int i = 0; i < length; i ++) 
        str[i] == ‘ ‘ ? spaceCount ++ : 0;
      
      
      int newLength = length + spaceCount * 2;
      str[newLength] = 0;
      
      length --;
      newLength --;
      while(length >= 0) 
        str[length] == ‘ ‘ ?
          (str[newLength --] = ‘0‘, str[newLength --] = ‘2‘, str[newLength --] = ‘%‘) :
          (str[newLength --] = str[length]);
        
        length --;
      
	
;

 

题目:从尾到头打印链表

题解:正着遍历链表,把结果存到 vector 里面,然后把 vector 倒一下,写这些算法题的时候还是喜欢练童子功,尽量避免调用 STL 函数之类的,手写比较能锻炼 coding 能力和 Bug free。

时间复杂度:$O(listLength)$

代码:

/**
*  struct ListNode 
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) 
*        
*  ;
*/
class Solution 
public:
    vector<int> printListFromTailToHead(ListNode* head) 
      vector<int> result;
      while(head != NULL) 
        result.push_back(head->val);
        head = head->next;
      
      
      for(int i = 0; i < result.size() / 2; i ++) 
        int t = result[i];
        result[i] = result[result.size() - 1 - i];
        result[result.size() - 1 - i] = t;
      
      
      return result;
    
;

  

以上是关于Challenge & Growth —— 从这里开始的主要内容,如果未能解决你的问题,请参考以下文章

June Challenge 2018 Division 2

CF&&CC百套计划2 CodeChef December Challenge 2017 Total Diamonds

Tinkoff Challenge - Final Round (ABC)

ODT&(Avito Code Challenge 2018 G题)

AC Challenge - 计蒜客

CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And his Cake