优秀的开发者不仅要掌握语言本身,更要熟悉各种开发工具和编程技巧。本文汇集了多种语言的实用技巧和工具,帮助你提升开发效率和代码质量。

JavaScript实用技巧

数组操作

基本排序

// 数字数组排序(从小到大)
function compare(num1, num2) {
    return num1 - num2;
}

var nums = [3, 1, 2, 100, 4, 200];
nums.sort(compare);
console.log(nums); // [1, 2, 3, 4, 100, 200]

// 从大到小排序
function compareDesc(num1, num2) {
    return num2 - num1;
}

nums.sort(compareDesc);
console.log(nums); // [200, 100, 4, 3, 2, 1]

注意:JavaScript的sort()方法默认将元素转换为字符串排序,所以对数字需要自定义比较函数。

迭代器方法

// map:创建新数组
function first(word) {
    return word[0];
}

var words = ["for", "your", "info"];
var acronym = words.map(first);
console.log(acronym.join("")); // "fyi"

// 数值计算
var numbers = [1, 2, 3, 4, 5];
var doubled = numbers.map(x => x * 2);
console.log(doubled); // [2, 4, 6, 8, 10]

filter过滤

// 筛选及格成绩
function passing(num) {
    return num >= 60;
}

var grades = [];
for (var i = 0; i < 20; i++) {
    grades[i] = Math.floor(Math.random() * 101);
}

var passGrades = grades.filter(passing);
console.log("全部成绩:", grades);
console.log("及格成绩:", passGrades);

// 筛选偶数
var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var evens = nums.filter(n => n % 2 === 0);
console.log(evens); // [2, 4, 6, 8, 10]

reduce累加

// 数组求和
var numbers = [1, 2, 3, 4, 5];
var sum = numbers.reduce((total, num) => total + num, 0);
console.log(sum); // 15

// 数组最大值
var max = numbers.reduce((a, b) => Math.max(a, b));
console.log(max); // 5

// 统计字符出现次数
var str = "hello world";
var charCount = str.split('').reduce((count, char) => {
    count[char] = (count[char] || 0) + 1;
    return count;
}, {});
console.log(charCount); // {h: 1, e: 1, l: 3, o: 2, ' ': 1, w: 1, r: 1, d: 1}

some和every

// some:是否存在满足条件的元素
var numbers = [1, 2, 3, 4, 5];
var hasEven = numbers.some(n => n % 2 === 0);
console.log(hasEven); // true

// every:是否所有元素都满足条件
var allPositive = numbers.every(n => n > 0);
console.log(allPositive); // true

var allGreaterThanThree = numbers.every(n => n > 3);
console.log(allGreaterThanThree); // false

forEach遍历

var colors = ["red", "green", "blue"];
colors.forEach((color, index) => {
    console.log(`${index}: ${color}`);
});
// 输出:
// 0: red
// 1: green
// 2: blue

二维数组操作

计算学生平均分

// 计算每个学生的平均分
var grades = [
    [89, 77, 78],
    [76, 82, 81],
    [91, 94, 89]
];
var total = 0;
var average = 0.0;

for (var row = 0; row < grades.length; row++) {
    for (var col = 0; col < grades[row].length; col++) {
        total += grades[row][col];
    }
    average = total / grades[row].length;
    console.log("Student " + (row + 1) + " average: " + average.toFixed(2));
    total = 0;
    average = 0.0;
}
// 输出:
// Student 1 average: 81.33
// Student 2 average: 79.67
// Student 3 average: 91.33

计算科目平均分

// 计算每门考试的平均分
var grades = [
    [89, 77, 78],
    [76, 82, 81],
    [91, 94, 89]
];
var total = 0;
var average = 0.0;

for (var col = 0; col < grades[0].length; col++) {
    for (var row = 0; row < grades.length; row++) {
        total += grades[row][col];
    }
    average = total / grades.length;
    console.log("Test " + (col + 1) + " average: " + average.toFixed(2));
    total = 0;
    average = 0.0;
}
// 输出:
// Test 1 average: 85.33
// Test 2 average: 84.33
// Test 3 average: 82.67

对象操作

按键排序对象

// 按对象的某个键排序
var obj = [
    {name: "Alice", age: 25},
    {name: "Bob", age: 20},
    {name: "Charlie", age: 30}
];

obj.sort((a, b) => a.age - b.age);
console.log(obj);
// [
//   {name: "Bob", age: 20},
//   {name: "Alice", age: 25},
//   {name: "Charlie", age: 30}
// ]

对象解构

// 解构赋值
var person = {name: "Alice", age: 25, city: "New York"};
var {name, age} = person;
console.log(name); // "Alice"
console.log(age); // 25

// 嵌套解构
var data = {
    user: {
        name: "Bob",
        address: {
            city: "Boston"
        }
    }
};
var {user: {address: {city}}} = data;
console.log(city); // "Boston"

jQuery实用技巧

jQuery是与否

// 检查jQuery是否加载
if (typeof jQuery === 'undefined') {
    console.log('jQuery not loaded');
} else {
    console.log('jQuery loaded');
}

// 检查元素是否存在
if ($('#myElement').length) {
    console.log('Element exists');
}

jQuery引入方式

<!-- 方式1:从CDN引入 -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

<!-- 方式2:本地文件 -->
<script src="/js/jquery-3.6.0.min.js"></script>

<!-- 方式3:使用包管理器 -->
<!-- npm install jquery -->
<script src="./node_modules/jquery/dist/jquery.min.js"></script>

<!-- 方式4:RequireJS -->
<script>
require(['jquery'], function($) {
    $(document).ready(function() {
        console.log('jQuery loaded via RequireJS');
    });
});
</script>

Python数据结构与算法

链表实现

基础链表

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

    def __str__(self):
        return str(self.value)

class LinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    def addNode(self, value):
        node = Node(value)
        if self.head is None:
            self.head = node
            self.tail = node
        else:
            self.tail.next = node
            self.tail = node

    def __str__(self):
        if self.head is not None:
            index = self.head
            nodeStore = [str(index.value)]
            while index.next is not None:
                index = index.next
                nodeStore.append(str(index.value))
            return "LinkedList [ " + "->".join(nodeStore) + " ]"
        return "LinkedList []"

def generateLinkedList(numArray):
    linkedlist = LinkedList()
    for i in range(len(numArray)):
        linkedlist.addNode(numArray[i])
    return linkedlist

# 使用示例
list1 = generateLinkedList([2, 4, 3])
print(list1)  # LinkedList [ 2->4->3 ]

链表相加

class ListsSum:
    def addLists(self, l1, l2):
        p1 = l1.head
        p2 = l2.head
        carry = 0
        linkedlist_sum = LinkedList()

        while (p1 is not None) or (p2 is not None) or (carry != 0):
            dig_sum = carry
            if p1 is not None:
                dig_sum += p1.value
                p1 = p1.next
            if p2 is not None:
                dig_sum += p2.value
                p2 = p2.next

            linkedlist_sum.addNode(dig_sum % 10)
            carry = dig_sum // 10

        return linkedlist_sum

# 使用示例
solution = ListsSum()
list1 = generateLinkedList([2, 4, 3])  # 342
list2 = generateLinkedList([5, 6, 4])  # 465
print(solution.addLists(list1, list2))  # 807: LinkedList [ 7->0->8 ]

栈的实现

class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if not self.is_empty():
            return self.items.pop()

    def is_empty(self):
        return len(self.items) == 0

    def peek(self):
        if not self.is_empty():
            return self.items[-1]

    def size(self):
        return len(self.items)

# 使用示例
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.pop())  # 3
print(stack.peek())  # 2
print(stack.size())  # 2

算法实践技巧

Java算法练习提示

  1. 使用Scanner处理输入
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String str = scanner.nextLine();
  1. 数组初始化技巧
// 动态数组
ArrayList<Integer> list = new ArrayList<>();

// 固定大小数组
int[] arr = new int[n];

// 二维数组
int[][] matrix = new int[m][n];
  1. 常用工具方法
// 数组排序
Arrays.sort(arr);

// 数组转字符串
Arrays.toString(arr);

// 填充数组
Arrays.fill(arr, value);

Perl技巧集锦

Perl One-Liners

文本处理

# 删除重复行
perl -ne 'print unless $a{$_}++' file.txt

# 查找重复行
perl -ne 'print if $a{$_}++' file.txt

# 添加行号
perl -ne 'print "$. $_"' file.txt

# 反转行顺序
perl -e 'print reverse <>' file.txt

# 随机排序行
perl -e 'print shuffle <>' file.txt

数值计算

# 计算列的总和
perl -lane '$sum += $F[0]; END { print $sum }' file.txt

# 计算平均值
perl -lane '$sum += $F[0]; $count++; END { print $sum/$count }' file.txt

# 查找最大值
perl -lane '$max = $F[0] if !defined $max || $F[0] > $max; END { print $max }' file.txt

Perl高级特性

静态变量

# 使用state定义静态变量(Perl 5.10+)
use feature 'state';

sub counter {
    state $count = 0;
    return ++$count;
}

print counter();  # 1
print counter();  # 2
print counter();  # 3

# 老版本方法
sub counter_old {
    my $count;
    $count ||= 0;
    return ++$count;
}

匿名子例程

# 创建闭包
sub create_counter {
    my $count = 0;
    return sub {
        return ++$count;
    };
}

my $counter1 = create_counter();
my $counter2 = create_counter();

print $counter1->();  # 1
print $counter1->();  # 2
print $counter2->();  # 1

数据结构实现对比

链表的多种实现

Perl链表实现

package LinkedList;

sub new {
    my $class = shift;
    my $self = {
        head => undef,
        tail => undef,
    };
    bless $self, $class;
    return $self;
}

sub add_node {
    my ($self, $value) = @_;
    my $node = {value => $value, next => undef};

    if (!defined $self->{head}) {
        $self->{head} = $node;
        $self->{tail} = $node;
    } else {
        $self->{tail}{next} = $node;
        $self->{tail} = $node;
    }
}

C链表实现

typedef struct Node {
    int value;
    struct Node* next;
} Node;

typedef struct LinkedList {
    Node* head;
    Node* tail;
} LinkedList;

void addNode(LinkedList* list, int value) {
    Node* node = (Node*)malloc(sizeof(Node));
    node->value = value;
    node->next = NULL;

    if (list->head == NULL) {
        list->head = node;
        list->tail = node;
    } else {
        list->tail->next = node;
        list->tail = node;
    }
}

线性表的顺序存储

指针实现(动态数组)

typedef struct {
    int* data;
    int length;
    int capacity;
} SeqList;

void initList(SeqList* list, int capacity) {
    list->data = (int*)malloc(sizeof(int) * capacity);
    list->length = 0;
    list->capacity = capacity;
}

void insert(SeqList* list, int index, int value) {
    if (index < 0 || index > list->length) {
        return; // 索引越界
    }

    if (list->length >= list->capacity) {
        // 扩容
        int newCapacity = list->capacity * 2;
        int* newData = (int*)realloc(list->data, sizeof(int) * newCapacity);
        if (newData) {
            list->data = newData;
            list->capacity = newCapacity;
        }
    }

    // 移动元素
    for (int i = list->length; i > index; i--) {
        list->data[i] = list->data[i - 1];
    }

    list->data[index] = value;
    list->length++;
}

引用实现(智能指针)

#include <memory>
#include <vector>

class SmartList {
private:
    std::shared_ptr<std::vector<int>> data;

public:
    SmartList() : data(std::make_shared<std::vector<int>>()) {}

    void insert(int index, int value) {
        if (index >= 0 && index <= data->size()) {
            data->insert(data->begin() + index, value);
        }
    }

    int get(int index) const {
        if (index >= 0 && index < data->size()) {
            return (*data)[index];
        }
        return -1; // 或抛出异常
    }

    int size() const {
        return data->size();
    }
};

二叉树遍历

递归实现

class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

def preorder_traversal(node):
    """前序遍历:根-左-右"""
    if node:
        print(node.value)
        preorder_traversal(node.left)
        preorder_traversal(node.right)

def inorder_traversal(node):
    """中序遍历:左-根-右"""
    if node:
        inorder_traversal(node.left)
        print(node.value)
        inorder_traversal(node.right)

def postorder_traversal(node):
    """后序遍历:左-右-根"""
    if node:
        postorder_traversal(node.left)
        postorder_traversal(node.right)
        print(node.value)

非递归实现(使用栈)

def preorder_iterative(root):
    """前序遍历非递归实现"""
    if not root:
        return

    stack = [root]
    while stack:
        node = stack.pop()
        print(node.value)

        # 先右后左,保证左子树先处理
        if node.right:
            stack.append(node.right)
        if node.left:
            stack.append(node.left)

def inorder_iterative(root):
    """中序遍历非递归实现"""
    stack = []
    current = root

    while current or stack:
        # 到达最左节点
        while current:
            stack.append(current)
            current = current.left

        current = stack.pop()
        print(current.value)
        current = current.right

实用编程技巧

文件批量操作

Perl批量重命名

use strict;
use warnings;
use Cwd;

my $target_dir = getcwd();
opendir(my $dh, $target_dir) || die "can't opendir $target_dir: $!";

my @files = grep { /\w/ && -f "$_" && !/^\./ } readdir($dh);

for (@files) {
    my $file = $_;
    # 示例:[Alex_Holmes]_Hadoop_in_Practice(BookZZ.org).pdf
    # 转换为:Hadoop_in_Practice.pdf
    if (/^(?:\[[\S\s]+\])([\S\s]+)(?:\([\S\s]+\))\.pdf$/) {
        my $new_name = $1 . ".pdf";
        rename($file, $new_name) || die("error in renaming: $!");
    }
}

Python批量操作

import os
import re

def batch_rename(directory):
    pattern = re.compile(r'\[.*?\](.*?)\(.*?\)\.pdf$')

    for filename in os.listdir(directory):
        match = pattern.match(filename)
        if match:
            new_name = match.group(1) + '.pdf'
            old_path = os.path.join(directory, filename)
            new_path = os.path.join(directory, new_name)
            os.rename(old_path, new_path)
            print(f"Renamed: {filename} -> {new_name}")

batch_rename('.')

文本处理技巧

删除^M字符

# Vim中删除DOS换行符
:%s/^M//g
# ^M输入方法Ctrl+V然后Enter
# Perl脚本删除^M并删除注释
open($IN, $ARGV[0]) or die "in: $@";
open($OUT, ">", $ARGV[0] . ".new") or die "out: $@";

while (<$IN>) {
    my $line = $_;
    $line =~ s/(\/\/.*)//g;  # 删除C风格注释
    $line =~ s/\r//g;        # 删除^M
    print $OUT $line;
}

close($IN);
close($OUT);

# 转换并替换原文件
$command = "mv $ARGV[0].new $ARGV[0] && chmod 777 $ARGV[0] && dos2unix $ARGV[0]";
system($command);

命令行工具技巧

按行长度排序

# 按行长度从长到短排序
cat file.txt | awk '{ print length($0) " " $0; }' | sort -r -n | cut -d ' ' -f 2-

# 按行长度从短到长排序
cat file.txt | awk '{ print length($0) " " $0; }' | sort -n | cut -d ' ' -f 2-

提取公共行

# 查找多个文件中的公共行
grep -F -x -f file1 file2 file3

# 查找在file1中但不在file2中的行
grep -F -x -v -f file2 file1

统计最常用命令

# 查看最常用的10个命令
history | awk '{a[$2]++} END {for(i in a) {print a[i]" "i}}' | sort -rn | head

模块化编程

创建可重用模块

# MyUtils.pm
package MyUtils;
use strict;
use warnings;
use Exporter 'import';

our @EXPORT_OK = qw(add multiply);

sub add {
    my ($a, $b) = @_;
    return $a + $b;
}

sub multiply {
    my ($a, $b) = @_;
    return $a * $b;
}

1;
# 使用模块
use MyUtils qw(add multiply);

print add(2, 3);        # 5
print multiply(2, 3);   # 6

Python模块化

# utils.py
def add(a, b):
    return a + b

def multiply(a, b):
    return a * b

# main.py
from utils import add, multiply

print(add(2, 3))        # 5
print(multiply(2, 3))   # 6

性能优化技巧

尾递归优化

// 普通递归阶乘
int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

// 尾递归优化版本
int factorial_tail(int n, int accumulator) {
    if (n <= 1) return accumulator;
    return factorial_tail(n - 1, n * accumulator);
}

int factorial(int n) {
    return factorial_tail(n, 1);
}

记忆化技术

# Fibonacci记忆化
from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

# 手动实现记忆化
def fibonacci_memo():
    cache = {}

    def fib(n):
        if n in cache:
            return cache[n]
        if n < 2:
            result = n
        else:
            result = fib(n - 1) + fib(n - 2)
        cache[n] = result
        return result

    return fib

fib = fibonacci_memo()

小结

本文汇集了多种编程语言和工具的实用技巧:

  1. JavaScript:数组操作、迭代器方法、jQuery技巧
  2. Python:数据结构实现、链表操作、算法实践
  3. Perl:One-liners、高级特性、文本处理
  4. 数据结构:多语言实现对比、算法优化
  5. 实用工具:文件操作、文本处理、命令行技巧

掌握这些技巧不仅能提高开发效率,还能帮助你写出更优雅、高效的代码。记住,好的工具和技巧是成为优秀开发者的重要助力。

持续学习和实践这些技巧,你会发现编程的更多乐趣和可能性。