初次接触leetcode,是我在一个招聘站点上看的,这个OJ真有那么厉害吗?

这几天在这个OJ上做了几道题,发现他的几个特点,1、题目不难(相对于ACM来说,我被ACM虐到至今无力),评判没那么苛刻,2、十分基础,从链表、树到动态规划等,都是很基本很经典的内容。相当的靠基本功,3、没有本地调试环境,直接在站点上提交,后台评判系统帮你完毕程序输入、评判输出的功能,4、国内外业内认可。有许多人都刷满了,留下了许多的优秀的演示样例代码。5、支持C++ 11的特性哦,一个autokeyword会让你爽大大的。

所以我认定这个OJ对巩固算法和数据结构的基本功,以及应付面试笔试有非常大作用。决定開始刷题。

初次刷体感到非常不适应,题目网页仅仅须要class Solution,没有输入,也没有输出什么的,调试在哪里?后来我发现,没有条件,那就须要自己创造条件了。

由于网上大部分都是解题提交的思路。不利于新手上路,所以我想写这么一个帖子,希望能对他人有所帮助,所以大牛莫笑呵呵。

好吧。假设有链表题。那么我们自己写main函数,首先去构造链表,然后去排序啦去反向了什么的。假设有树题,那么我们自己写main函数,去构造树,然后调试。

嗯,这里就须要这么几个要素:

1、程序输入的数据,就是用来构造链表、树的内容的数据。一个来源是rand(),使用随机数,还有一个来源就是手动输入了。

在链表题中。因为我们仅仅须要一些内容,来看看排序效果什么的。所以能够通过随机数来产生数据,代码(仅仅写有关的头文件和语句)例如以下:

#include <stdlib.h>
#include <time.h>
int lt = time(NULL);
srand(lt);
int len = rand()%100;
int data = rand() % 100;

如此去产生随机数据

在树题中,比方有题目是推断是否是对称树(symmetric tree),那么我们希望手动输入树的数据为好,将树的节点内容以main函数參数输入给程序,运行时如 :

./symmetric_tree 123##5

这里的123##5是leetcode中的树的表示,事实上就是依照满二叉树的按层遍历来构造的。123##5构造了例如以下一颗树,当中2的1的左右孩子是2、3,2的左右孩子是##,就是空。2 是一个叶子节点了,3的左孩子是5。右孩子是空,空就不用输入数据了。调试时,我们须要依照这样的方式构造树。

1

2 3

# #
5

2、构造链表,代码例如以下

void addToTail(ListNode **head, int val)
{
ListNode *node = new ListNode(val);
if(!*head)
{
*head = node;
}
else
{
ListNode *tmp = *head;
while(tmp->next)
tmp = tmp->next;
tmp->next = node;
}
}
int main()
{
int lt = time(NULL);
srand(lt);
int len = rand()%20;
cout << len<<endl;
if(len < 1)
return 0;
<span style="white-space:pre"> </span>ListNode *root = NULL;
for(int i=0; i<len; i++)
addToTail(&root, rand()%100) }

3、构造树

依照 123##5构造二叉树,当中constructTree函数属于按层构造二叉树的方式。

#include <stdio.h>
#include <stdlib.h>
#include <stack>
#include <iostream>
#include <vector>
#include <typeinfo>
#include <exception>
#include <map>
#include <list>
#include <algorithm>
#include <time.h>
using namespace std; struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int val):val(val), left(NULL),right(NULL){} ;
}; TreeNode *constructTree(char *dat , int len)
{
TreeNode *root = NULL;
int index = 0;
if(len > 0)
root = new TreeNode(dat[index] - '0');
else
return NULL; list<TreeNode *> node;
node.push_back(root);
index ++;
while(index < len)
{
if(!node.empty())
{
TreeNode *root = node.front();
if(index < len )
{
if(dat[index] != '#')
{
root->left = new TreeNode(dat[index] - '0');
node.push_back(root->left);
}
index ++;
}
if(index < len )
{
if(dat[index] != '#')
{
root->right = new TreeNode(dat[index] - '0');
node.push_back(root->right);
}
index ++;
}
node.pop_front();
}
} return root;
} class Solution {
public:
vector<int> inorderTraversal(TreeNode *root) {
vector<int > tree;
TreeNode *node = root;
// traversal(node, tree);
itera_traversal(node, tree);
return tree;
}
void traversal(TreeNode *node, vector<int> &tree)
{
if(!node)
return; traversal(node->left, tree);
tree.push_back(node->val);
traversal(node->right, tree); }
void itera_traversal(TreeNode *node, vector<int> &tree)
{
stack<TreeNode *> lroot;
TreeNode *root = node;
while(root || !lroot.empty())
{
while(root)
{
lroot.push(root);
root = root->left;
}
if(!lroot.empty())
{
root = lroot.top();
tree.push_back(root->val);
lroot.pop();
root = root->right;
}
}
}
}; int main(int argc, char *argv[])
{
if(argc < 2)
{
cout <<"Usage: ./binary_tree_inorder_traversal treelist(1234#5####6)"<<endl;
exit(1);
} string treeinfo = argv[1];
if(treeinfo.size() < 1)
{
cout <<"tree data invalid"<<endl;
exit(1);
}
int len = treeinfo.size();
char *dat = new char[len];
for(int i=0; i<len; i++)
{
dat[i] = treeinfo[i];
}
for(int i=0; i<len; i++)
cout << "\t"<<dat[i] ;
cout << endl; TreeNode *root = NULL;
root = constructTree(dat, len); Solution s;
vector<int > seq = s.inorderTraversal(root);
for(int i=0; i<seq.size(); i++)
cout <<"\t"<<seq[i];
cout << endl;
cout << endl; delete dat;
}

只是这样的123##5的方式有一定缺陷,在某个节点值为15、20,344等的时候,怎么办了。那就仅仅能依照把全部參数都输入给main函数。运行时类似于

./validate_binary_search_tree.o 4 2 6 5 3 1 # 6

#include <stdio.h>
#include <stdlib.h>
#include <stack>
#include <iostream>
#include <vector>
#include <typeinfo>
#include <exception>
#include <map>
#include <list>
#include <algorithm>
#include <time.h>
#include <string.h>
using namespace std; struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int val):val(val), left(NULL),right(NULL){} ;
}; TreeNode *constructTree(int *dat , int len)
{
TreeNode *root = NULL;
int index = 0;
if(len > 0)
root = new TreeNode(dat[index]);
else
return NULL; list<TreeNode *> node;
node.push_back(root);
index ++;
while(index < len)
{
if(!node.empty())
{
TreeNode *root = node.front();
if(index < len )
{
if(dat[index] != '#')
{
root->left = new TreeNode(dat[index]);
node.push_back(root->left);
}
index ++;
}
if(index < len )
{
if(dat[index] != '#')
{
root->right = new TreeNode(dat[index]);
node.push_back(root->right);
}
index ++;
}
node.pop_front();
}
} return root;
} void traversal(TreeNode *node)
{
if(!node)
return;
cout <<"\t"<< node->val;
traversal(node->left);
traversal(node->right);
} class Solution {
public:
bool isValidBST(TreeNode *root)
{
int minmum = 0xffffffff;
return judge(root, minmum);
} bool judge(TreeNode *root, int &min)
{
if(!root)
return true;
bool flag = judge(root->left, min);
if(!flag)
return false;
if(root->val < min)
return false;
min = root->val;
return judge(root->right, min);
}
}; int main(int argc, char *argv[])
{
if(argc < 2)
{
cout <<"Usage: ./binary_tree_inorder_traversal tree_list(4 2 6 5 3 1 # 6) "<<endl;
exit(1);
} int len = argc -1 ;
cout << len <<endl; int *data = (int *)malloc(sizeof(int) * len);
memset(data, 0, sizeof(char)*len);
for(int i=1; i<argc; i++)
{
if(*argv[i] != '#')
data[i-1] = atoi(argv[i]) ;
else
data[i-1] = '#';
}
for(int i=0; i < len ; i++)
cout <<"\t"<< data[i] ;
cout << endl;
cout << endl; TreeNode *tree = NULL;
tree = constructTree(data, len); traversal(tree);
cout << endl; Solution s;
cout << s.isValidBST(tree) <<endl;
}

这种方法将每一个參数都atoi为整数,那么在构造二叉树函数constructTree中,就须要注意。‘#’的ascii码值是34,小心哦。只是用来測试,勉强可用吧。

leetcode中,代码怎样调试,创造本地执行环境的更多相关文章

  1. 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?

    HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称.如下面的代码片段所示,一个HostingEnv ...

  2. https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题

    一:什么是https SSL(Security   Socket   Layer)全称是加密套接字协议层,它位于HTTP协议层和TCP协议层之间,用于建立用户与服务器之间的加密通信,确保所传递信息的安 ...

  3. 【转】https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题

    正需要这个,写的很好,就转过来了 转自: http://www.cnblogs.com/naniannayue/ 一:什么是https SSL(Security   Socket   Layer)全称 ...

  4. js中的执行环境及作用域

    最近在面试时被问到了对作用域链的理解,感觉当时回答的不是很好,今天就来说说js中的作用域链吧. 首先来说说js中的执行环境,所谓执行环境(有时也称环境)它是JavaScript中最为重要的一个概念.执 ...

  5. 如何设置pycharm中使用的环境为本地的环境,而不用重新安装包

    Pycharm的两种环境配置 1.新建一个虚拟环境 一开始使用pycharm创建project的时候,点击创建 create new project: 然后就会弹出下面的窗口,如果我们选择的是上面的选 ...

  6. JS 作用域(执行环境)与作用链---JS 学习笔记(二)

    一  作用域(执行环境) 作用域:定义了变量和函数有权访问的其他数据,决定了他们各自的行为.--------<JS高级程序设计>4.2 好难理解啊~参考了参考尤克希的博客内容,大体上理解了 ...

  7. Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

    执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...

  8. 深入理解javascript作用域系列第五篇——一张图理解执行环境和作用域

    × 目录 [1]图示 [2]概念 [3]说明[4]总结 前面的话 对于执行环境(execution context)和作用域(scope)并不容易区分,甚至很多人认为它们就是一回事,只是高程和犀牛书关 ...

  9. Javascript 执行环境及作用域

    执行环境是javascript中最为重要的一个概念. 执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为. 每个执行环境都有一个与之关联的变量对象(variable object),环境 ...

随机推荐

  1. [转] 64位Oracle 11g R2的客户端连接时报ORA-01019错误

    本文转自:http://blog.csdn.net/downmoon/article/details/8038583 在Win8企业版64位环境下,连接Oracle11g 服务端,搞了整整两天,特将过 ...

  2. UIPickerView的应用

    UIPickerView 是一个选择器控件, 它可以生成单列的选择器,也可生成多列的选择器.UIPickerView 直接继承了 UIView ,没有继承 UIControl ,因此,它不能像 UIC ...

  3. Jupyter(Ipython) Notebook 入门

    upyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言. 一般用来编写漂亮的交互式文档. 文学编程的读者不是机器,而是人. 我们 ...

  4. JS——input标签注册事件

    注意:淘宝的lable是用定位制作的,事件是oninput事件 <!DOCTYPE html> <html> <head lang="en"> ...

  5. 数据结构应用实例#栈&单链表#简易计算器

    修改BUG的时候一不小心BUG越修越多,鉴于维护程序并不是学习数据结构的初衷,我已经果断的弃坑了!! 以下内容再不更新,Github上的代码直接无法正常编译运行.... 参考参考就好,学习到栈的作用就 ...

  6. [转]linux实时查看更新日志命令

    很多时候在调试生成或正式平台服务器的时候想查看实时的日志输出,在Linux中可以使用tail 或 watch来实现. 比如我们项目中有个 app.log 的日志文件,我们普通读取都使用 vi app. ...

  7. NSOperationQueue和GCD的区别,以及在什么场合下使用

    1> GCD是纯C语言的API .NSOperationQueue是基于GCD的OC的封装. 2> GCD只支持FIFO队列,NSOperationQueue可以方便设置执行顺序,设置最大 ...

  8. anguar相关

    1.创建组件 在某目录下创建组件  ng g c content/membersManage 2.创建服务 在某目录下创建服务  ng g service services/storage 2.创建模 ...

  9. LeetCode--寻找数组中心索引

    给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和. 如果数组不存在中心索引,那么我 ...

  10. HDU-5968异或密码

    超级传送门 题目描述: 晨晨在纸上写了一个长度为N的非负整数序列{ai}.对于这个序列的一个连续子序列{al,al+1,…,ar}晨晨可以求出其中所有数异或的结果 alxoral+1xor...xor ...