编写leetcode测试用例时所用的辅助函数

         在做leetcode题目(https://oj.leetcode.com/problemset/algorithms/)的时候,我们总要自己写测试用例,常常要生成vector, list, tree,我将这些常用操作封装了一下,方便大家使用

 tool.h

//tool.h
#ifndef TOOL_H_
#define TOOL_H_

#include <iostream>
#include <vector>
#include <cstdarg>
#include <string>
using namespace std;

#include "windows.h"

struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x=0) : val(x), left(NULL), right(NULL) {}
};

void ArrayPrint(int arr[], int count);

vector<int> IntVectorCreate(int count, ...);
void IntVectorPrint(const vector<int> &vec);
void IntVector2DPrint(const vector<vector<int>> &vec);

vector<string> StringVectorCreate(int count, ...);
void StringVectorPrint(const vector<string> &vec);

TreeNode *TreeCreate(int count, ...);
void TreePrint(TreeNode *root);

ListNode *ListCreate(int count, ...);
void ListPrint(ListNode *head);

#endif
tool.cpp
//tool.cpp
#include "tool.h"

void ListPrint(ListNode *head)
{
    ListNode *node = head;
    while (node)
    {
        cout << node->val << " -> ";
        node = node->next;
    }
    cout << endl;
}

ListNode *ListCreate(int count, ...)
{
    va_list argptr;
    va_start(argptr, count);

    ListNode *head, *curr;
    int num = va_arg(argptr, int);
    head = new ListNode(num);
    curr = head;
    for (int i = 1; i < count; i++)
    {
        num = va_arg(argptr, int);
        ListNode *temp = new ListNode(num);
        curr->next = temp;
        curr = temp;
    }
    va_end(argptr);
    return head;
}




void ArrayPrint(int arr[], int count)
{
    for (int i = 0; i < count; i++)
        cout << arr[i] << " , ";
    cout << endl;
}

void IntVectorPrint(const vector<int> &vec)
{
    for (size_t i = 0; i < vec.size(); i++)
        cout << vec[i] << " , ";
    cout << endl;
}

void IntVector2DPrint(const vector<vector<int>> &vec)
{
    printf("[\n");
    for (size_t i = 0; i < vec.size(); i++)
    {
        printf("[ ");
        for (size_t j = 0; j < vec[i].size(); j++)
            printf("%d, ", vec[i][j]);
        printf(" ]\n");
    }
    printf("]\n");
}

void StringVectorPrint(const vector<string> &vec)
{
    cout << "------------------------------------" << endl;
    for (size_t i = 0; i < vec.size(); i++)
        cout << vec[i] << "_" << endl;
    cout << "------------------------------------" << endl;
}

//

vector<int> IntVectorCreate(int count, ...)
{
    vector<int> result;
    va_list argptr;
    va_start(argptr, count);
    
    for(int i=0; i<count; i++) 
    {
        int num = va_arg(argptr, int);
        result.push_back(num);
    }
    va_end(argptr);
    return result;
}

vector<string> StringVectorCreate(int count, ...)
{
    vector<string> result;
    va_list argptr;
    va_start(argptr, count);

    for (int i = 0; i < count; i++)
    {
        char *str = va_arg(argptr, char*);
        result.push_back(str);
    }
    va_end(argptr);
    return result;
}

//

TreeNode *TreeCreate(int count, ...)
{
    va_list argptr;
    va_start(argptr, count);

    TreeNode **treeArr = new TreeNode*[count];
    for (int i = 0; i < count; i++)
    {
        int num = va_arg(argptr, int);
        if (INT_MAX == num)
            treeArr[i] = NULL;
        else
            treeArr[i] = new TreeNode(num);
    }

    int curr = 1;
    for (int i = 0; i<count; i++)
    {
        if( !treeArr[i] )
            continue;
 
        if( curr < count )
            treeArr[i]->left = treeArr[curr++];
        if (curr < count)
            treeArr[i]->right = treeArr[curr++];
    }
    
    va_end(argptr);
    return treeArr[0];
}


void SubTreePrint(TreeNode *node, int level)
{
    if ( !node )
        return;

    SubTreePrint(node->right, level + 1);
    for (int i = 0; i < level; i++)
        printf("    ");
    printf("%04d\n", node->val);
    SubTreePrint(node->left, level + 1);
}

void TreePrint(TreeNode *root)
{
    cout << "------------------------------------" << endl;
    SubTreePrint(root, 0);
    cout << "------------------------------------" << endl;
}

array, vector, list这几个结构的Create和Print很简单,就不多解释了

PS: XXXCreate函数的第一个参数总是元素的个数

int main()
{
    int arr[] = { 1, 2, 3, 4, 5 };
    ArrayPrint(arr, 5);

    vector<int> ivec = IntVectorCreate(5, 1, 2, 3, 4, 5);
    IntVectorPrint(ivec);

    vector<string> svec = StringVectorCreate(5, "11", "22", "33", "44", "55");
    StringVectorPrint(svec);

    ListNode *node = ListCreate(5, 1, 2, 3, 4, 5);
    ListPrint(node);

    getchar();
    return 0;
}


tree的情况比较复杂,详细解释一下

假设一棵树如下:


那么leetcode上的表示是:{1,2,3,#,#,4,#,#,5}

代码是这个样子的:(#用INT_MAX代替)

    TreeNode *tree = TreeCreate(9, 1, 2, 3, INT_MAX, INT_MAX, 4, INT_MAX, INT_MAX, 5);
    TreePrint(tree);

打印出来之后,就是这个样子的


一切搞定

在Java中使用LeetCode是一种常见的方式来练习和提高算法和数据结构的能力。LeetCode提供了大量的算法题目,每个题目都有一个特定的要求和限制条件。在解题过程中,我们需要按照题目要求设计和实现解决方案。 对于Java的LeetCode编程,一般我们会按照以下步骤进行: 1. 阅读题目:仔细阅读题目的要求和限制条件,理解题目的意思。 2. 分析问题:根据题目的要求和限制条件,考虑可用的算法和数据结构来解决问题。可以使用图、树、链表、数组、哈希表等数据结构,以及常见的算法如深度优先搜索、广度优先搜索、动态规划、回溯等。 3. 实现算法:使用Java编写算法的解决方案。根据题目的要求,我们可以使用类、方法等来组织和实现代码。 4. 编写测试用例:为了验证解决方案的正确性,编写测试用例是必不可少的。测试用例应该包括各种情况,包括边界情况和一般情况。 5. 运行和测试:运行编写的代码,并使用编写测试用例进行测试。通过测试用例的执行结果,我们可以判断代码的正确性和性能。 在编写测试用例,我们应该考虑尽可能多的情况,以确保代码的正确性。测试用例应该包括输入数据和预期输出结果。可以使用JUnit等测试框架来组织和运行测试用例。 总结来说,Java的LeetCode编程需要认真阅读题目,分析问题,设计具体的解决方案,并使用合适的数据结构和算法进行实现。编写测试用例是验证解决方案正确性的重要步骤,可以使用JUnit等测试框架来辅助进行测试。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值