初次接触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. html表单——使用frameset写一个导航栏效果

    主页面: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4 ...

  2. 开始玩qt,使用代码修改设计模式生成的菜单

    之前制作菜单时,不是纯代码便是用设计模式 直接图形化完成. 今天我就是想用代码修改已经存在的菜单项,如果是用代码生成的可以直接调用指针完成: 但通过设计模式完成的没有暴露指针给我,至少我没发现. 在几 ...

  3. 正则表达式 \D 元字符

    \D元字符可以匹配非数字字符,等价于"[^0-9]". 语法结构: (1).构造函数方式: new RegExp("\\D") (2).对象直接量方式: /\D ...

  4. Django 更新字段

    Django在1.7以后的版本提供数据迁移命令,用来在修改模型中的字段,更新到数据库 1. python manager.py makemigrations 命令用来创建迁移文件版本的 2. pyth ...

  5. Linux内核系统调用处理过程

    原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 学号末三位:168 下载并编译Linux5.0 xz -d linux-.tar.xz . ...

  6. 面试bb

    1.面试者进行自我介绍 2.学校/学历/大学生活及课程的心得总结(人品,性格评估) 3.技能介绍(是否对应聘工作有帮助,评估学习能力):编程/操作系统/测试工具/测试方法/脚本 4.离职原因/项目经验 ...

  7. enote笔记语言(5)——其他

    章节:其他   ((主:单词))                               用来醒目地强调这个句子中哪个词语作主语 sentence:                         ...

  8. enote笔记语言(4)(ver0.3)——“5w1h2k”分析法

    章节:“5w1h2k”分析法   what:我想知道某个“关键词(keyword)”(即,词汇.词语,或称单词,可以是概念|专业术语|.......)的定义. why:我想知道事物发生的原因.“why ...

  9. sudo dpkg-reconfigure phpmyadmin命令,重新配置一遍phpmyadmin

    sudo dpkg-reconfigure phpmyadmin命令,重新配置一遍phpmyadmin

  10. python第十二周:MySql

    MySql数据库 MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司.MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不 ...