刷题中二维数组字符串输入处理问题

前言:处理输入问题,看似简单,实则有些细节需要注意。原因是,笔试以及面试撕代码时碰到下面的场景,一时之间不知道怎么处理。

刷题中处理输入问题

输入字符串实例:
[[1,2,3],[2,3,4],[4,5,6]]
[[1, 2]]
[[]]

下面测试的输出情况:按一维数组打印
[1, 2, 3]
[2, 3, 4]
[4, 5, 6]

[1, 2]

[0]

注意:
两个二维数组之间分隔],[中间还有空格的情况

public class Main {
    public static void main(String[] args) {

        String input1 = "[[1,2,3],[2,3,4],[4,5,6]]";
        String input2 = "[[1, 2]]";
        String input3 = "[[]]";
        int[][] handle = handle(input1);
        print(handle);
        System.out.println();
        handle = handle(input2);
        print(handle);
        System.out.println();
        handle = handle(input3);
        print(handle);
        System.out.println();

    }
    public static int[][] handle(String input){
        // 首先去掉前后的两重中括号, 将],[替换为]#[再利用空格分隔
        // 特别注意:这里有两个一维数组之间的分隔到底是],[ 还是], [ 后面有个空格,需要视情况而定。元素前后有空格无需考虑
        String[] replace = input.substring(1, input.length()-1).replace("],[", "]#[").split("#");
        int rows = replace.length;
        int cols = replace[0].split(",").length; //
/*      for(String sub :replace)
            System.out.println(sub);
        System.out.println("rows: "+rows + " cols: " + cols);*/

        int[][] array = new int[rows][cols]; // 返回数组
        loop:
        for (int i = 0; i < rows; i++) {
            String[] tmp = replace[i].substring(1, replace[i].length()-1).split(","); // 去掉前后中括号,再以,分割
            for (int j = 0; j < cols; j++) {
                if(tmp[j].length() == 0) {
                    break loop; // 若数组元素为空则说明异常。若是正常输入,这里无需考虑判断跳出
                }
                array[i][j] = Integer.parseInt(tmp[j].trim()); // trim目的是去掉前后空格,例如 1, 2
            }
        }
        return array;
    }

    public static void print(int[][] array){
        int rows = array.length;
        int cols = array[0].length;
        for (int i = 0; i < rows; i++) {
            System.out.println(Arrays.toString(array[i]));
        }
    }
}

总结:
见到字符串替换,切割就行了。使用正则表达容易出错。

<think>好的,用户之前问过如何学习算法,作为一个新手,现在他补充说想用C语言而不是Python,需要学到什么程度。我需要先理解他的需求和背景。可能他之前得到的学习路径是建议Python,但他现在可能有特殊需求,比如学校课程、项目要求或者对C语言感兴趣。 首先,我需要明确学习算法用C语言的不同之处。C语言相比Python更底层,需要手动管理内存,语法更严格,但能更好地理解数据结构在内存中的表示。用户作为小白,可能对C的难度不太清楚,需要给出具体的学习建议,避免他半途而废。 接下来,我得确定用户需要学到什么程度。学习算法的话,不需要掌握C的所有高级特性,但必须掌握基础语法、指针、结构体、动态内存分配这些关键点。比如,指针在数据结构中非常重要,链表、树等结构都需要用到。同时,动态内存管理是必须的,因为很多数据结构需要在运行时分配内存。 然后,用户可能需要资源推荐,特别是针对C语言的数据结构和算法。需要列出一些经典书籍,比如《C Primer Plus》打基础,《数据结构与算法分析——C语言描述》作为进阶。同时,推荐实践方法,比如如何从数组和结构体开始,逐步构建链表、栈、队列,再过渡到更复杂的结构。 还要注意用户可能的误区,比如指针理解困难,或者内存泄漏问题。需要提醒他重视调试和动手实践,因为C语言更容易出现这些问题,而这对于算法实现来说是基础。 另外,用户可能担心C语言的学习曲线陡峭,所以需要鼓励他,指出虽然C更难,但对理解底层有帮助,坚持下去会有更深的理解。同时,建议分阶段学习,先掌握基础,再逐步深入数据结构,最后结合算法目练习。 最后,总结学习路径,强调每一步的关键点,并给予鼓励,帮助他保持动力。需要确认回答是否覆盖了C语言的关键知识点,以及如何与算法学习相结合,确保用户能够明确学习目标和步骤。</think>如果你想用 **C语言** 学习算法(而不是Python),需要掌握以下核心知识点和编程能力。C语言相比Python更底层,需要更关注内存管理和数据结构的手动实现,但这也让你更深入理解算法的底层逻辑。以下是具体的学习目标和建议: --- ### **1. C语言需要掌握的程度** #### **基础语法** - **必须熟练**: - 变量、数据类型(`int`, `float`, `char`, 数组) - 流程控制(`if-else`, `for`, `while`, `switch`) - 函数定义和调用(参数传递、返回值) - 指针的基本操作(指针定义、取地址`&`、解引用`*`) - 结构体(`struct`)的定义和使用 - 动态内存管理(`malloc`, `free`,避免内存泄漏) - **需要理解**: - 指针与数组的关系(如数组名是指针常量) - 字符串操作(`strcpy`, `strcmp`等函数,注意结尾的`\0`) - 文件读写(`fopen`, `fread`, `fwrite`,算法中较少用,但实际项目可能涉及) --- #### **重点难点** - **指针的深入理解**: 指针是C语言的核心,算法中大量使用指针操作数据结构(如链表、树)。需要掌握: - 指针的指针(如`int**`用于动态二维数组) - 函数指针(高阶用法,初期可暂缓) - **动态内存分配**: 算法中常用动态内存构建灵活的数据结构(如链表、二叉树),必须掌握: - `malloc`和`free`的配对使用 - 避免“野指针”和“内存泄漏” --- ### **2. 如何结合C语言学习算法?** #### **阶段一:用C实现基础数据结构** 1. **数组字符串** - 实现数组的增删改查 - 练习字符串反转、子串查找等基础算法 2. **结构体与链表** - 手写单链表/双链表(插入、删除、反转) - 示例代码框架: ```c typedef struct Node { int data; struct Node* next; } Node; Node* create_node(int data) { Node* new_node = (Node*)malloc(sizeof(Node)); new_node->data = data; new_node->next = NULL; return new_node; } ``` 3. **栈与队列** - 用数组实现静态栈/队列 - 用链表实现动态栈/队列 4. **树与图** - 二叉树的结构体定义与遍历(递归实现) - 图的邻接表表示(结构体嵌套指针) --- #### **阶段二:用C实现经典算法** 1. **排序算法** - 实现冒泡排序、快速排序(注意指针操作) - 示例:快速排序的分区函数 ```c int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] < pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return i + 1; } ``` 2. **递归与分治** - 用递归实现斐波那契数列、汉诺塔 - 注意C语言的递归栈深度限制(可能溢出) 3. **动态规划** - 用数组实现背包问题、最长公共子序列 - 注意C中二动态数组的创建: ```c int** dp = (int**)malloc(rows * sizeof(int*)); for (int i = 0; i < rows; i++) { dp[i] = (int*)malloc(cols * sizeof(int)); } ``` --- ### **3. 学习资源推荐** - **书籍** - 《C Primer Plus》:适合零基础系统学习C语言 - 《数据结构与算法分析——C语言描述》:经典教材,代码示例丰富 - 《C和指针》:深入理解指针的必读书 - **实战练习** - **LeetCode**:支持C语言提交,选择“简单”难度目(如[两数之和](https://leetcode.cn/problems/two-sum/)) - **PTA(程序设计类实验辅助教学平台)**:国内高校库,适合练习基础语法和算法 --- ### **4. 注意事项** 1. **重视调试**: C语言没有Python的易用性,需学会用`printf`调试或工具(如GDB)。 2. **避免指针错误**: - 初始化指针时赋值为`NULL` - 释放内存后立即将指针置`NULL` 3. **从简单到复杂**: 先实现线性结构(如链表),再逐步挑战树、图等复杂结构。 --- ### **总结:C语言学算法的优势与挑战** - **优势**:深入理解内存管理、提升代码效率意识。 - **挑战**:需要更多代码量实现相同功能,但坚持下来会对计算机系统有更深理解。 建议学习路线: **C基础语法 → 指针与结构体 → 动态内存管理 → 手写数据结构 → 实现经典算法 → 巩固** 坚持动手写代码,即使一个链表调试半天也是宝贵经验! 🚀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值