Rust每日一练(leetDay0001) 两数之和、两数相加、最长子串

目录

1. 两数之和 Two Sum  🌟

2. 两数相加 Add Two Numbers  🌟🌟

3. 无重复字符的最长子串 Longest substring without repeating characters  🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


1. 两数之和 Two Sum

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 10^4
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9
  • 只会存在一个有效答案

进阶:你可以想出一个时间复杂度小于 O(n^2) 的算法吗?

代码1: 暴力枚举

fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
    let n = nums.len();
    for i in 0..n {
        for j in i+1..n {
            if nums[i] + nums[j] == target {
                return vec![i as i32, j as i32];
            }
        }
    }
    vec![]
}

fn main() {

    let nums = [2, 7, 11, 15];
    let target = 9;
    println!("{:?}", two_sum((&nums).to_vec(), target));

    let nums = [3, 2, 4];
    let target = 6;
    println!("{:?}", two_sum((&nums).to_vec(), target));

    let nums = [3, 3];
    println!("{:?}", two_sum((&nums).to_vec(), target));
}

 代码2: 二分查找

fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
    let n = nums.len();
    for i in 0..n {
        let complement = target - nums[i];
        if let Ok(j) = nums.binary_search(&complement) {
            if i != j {
                return vec![i as i32, j as i32];
            }
        }
    }
    vec![]
}

fn main() {

    let nums = [2, 7, 11, 15];
    let target = 9;
    println!("{:?}", two_sum((&nums).to_vec(), target));

    let nums = [3, 2, 4];
    let target = 6;
    println!("{:?}", two_sum((&nums).to_vec(), target));

    let nums = [3, 3];
    println!("{:?}", two_sum((&nums).to_vec(), target));
}

 代码3: 哈希表

use std::collections::HashMap;

fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
    let mut map = HashMap::new();
    for (i, num) in nums.iter().enumerate() {
        let complement = target - num;
        if let Some(j) = map.get(&complement) {
            return vec![*j as i32, i as i32];
        }
        map.insert(num, i);
    }
    vec![]
}

fn main() {

    let nums = [2, 7, 11, 15];
    let target = 9;
    println!("{:?}", two_sum((&nums).to_vec(), target));

    let nums = [3, 2, 4];
    let target = 6;
    println!("{:?}", two_sum((&nums).to_vec(), target));

    let nums = [3, 3];
    println!("{:?}", two_sum((&nums).to_vec(), target));
}

 数组 + 哈希表 

fn two_sum(nums: &[i32], target: i32) -> Vec<i32> {
    let mut imap = std::collections::HashMap::new();
    for (i, num) in nums.iter().enumerate() {
        let two = target - num;
        if let Some(&j) = imap.get(&two) {
            return vec![j as i32, i as i32];
        }
        imap.insert(num, i);
    }
    vec![]
}

fn main() {

    let nums = [2, 7, 11, 15];
    let target = 9;
    println!("{:?}", two_sum(&nums, target));

    let nums = [3, 2, 4];
    let target = 6;
    println!("{:?}", two_sum(&nums, target));

    let nums = [3, 3];
    println!("{:?}", two_sum(&nums, target));
}

代码4: 排序+双指针

fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
    let mut nums = nums;
    let n = nums.len();
    for i in 0..n {
        nums[i] = nums[i].clone() as i32;
    }
    let mut pairs: Vec<(i32, usize)> = nums.iter()
        .enumerate()
        .map(|(i, &x)| (x, i))
        .collect();
    pairs.sort_unstable();
    let (mut i, mut j) = (0, n - 1);
    while i < j {
        let sum = pairs[i].0 + pairs[j].0;
        if sum == target {
            let (index1, index2) = (pairs[i].1 as i32, pairs[j].1 as i32);
            return vec![index1, index2];
        } else if sum < target {
            i += 1;
        } else {
            j -= 1;
        }
    }
    vec![]
}

fn main() {

    let nums = [2, 7, 11, 15];
    let target = 9;
    println!("{:?}", two_sum((&nums).to_vec(), target));

    let nums = [3, 2, 4];
    let target = 6;
    println!("{:?}", two_sum((&nums).to_vec(), target));

    let nums = [3, 3];
    println!("{:?}", two_sum((&nums).to_vec(), target));
}

输出:

[0, 1]
[1, 2]
[0, 1]


2. 两数相加 Add Two Numbers

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

代码1: 模拟竖式加法

use std::fmt;

struct ListNode {
    data: i32,
    next: Option<Box<ListNode>>,
}

impl ListNode {
    fn new(data: i32) -> Self {
        ListNode { data, next: None }
    }

    fn build(list: &[i32]) -> Option<Box<ListNode>> {
        let mut head = None;
        for i in (0..list.len()).rev() {
            head = Some(Box::new(ListNode {
                data: list[i],
                next: head,
            }));
        }
        head
    }
}

impl fmt::Debug for ListNode {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let mut p = Some(self);
        while let Some(node) = p {
            write!(f, "{}->", node.data)?;
            p = node.next.as_ref().map(|x| x.as_ref());
        }
        write!(f, "<nil>")
    }
}

fn add_two_numbers(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
    let mut dummy_head = ListNode::new(0);
    let (mut p1, mut p2, mut curr) = (l1, l2, &mut dummy_head);
    let mut carry = 0;
    while p1.is_some() || p2.is_some() || carry != 0 {
        let mut sum = carry;
        if let Some(node) = p1 {
            sum += node.data;
            p1 = node.next;
        }
        if let Some(node) = p2 {
            sum += node.data;
            p2 = node.next;
        }
        carry = sum / 10;
        curr.next = Some(Box::new(ListNode::new(sum % 10)));
        curr = curr.next.as_mut().unwrap();
    }
    dummy_head.next
}

fn main() {
    let l1 = ListNode::build(&[2, 4, 3]);
    let l2 = ListNode::build(&[5, 6, 4]);
    println!("{:?}", l1);
    println!("{:?}", l2);
    println!("{:?}", add_two_numbers(l1, l2));

    let l1 = ListNode::build(&[9,9,9,9,9,9,9]);
    let l2 = ListNode::build(&[9,9,9,9]);
    println!("{:?}", l1);
    println!("{:?}", l2);
    println!("{:?}", add_two_numbers(l1, l2));
}

代码2: 模拟竖式加法2

use std::fmt;

struct ListNode {
    data: i32,
    next: Option<Box<ListNode>>,
}

impl ListNode {
    fn new(data: i32) -> Self {
        ListNode { data, next: None }
    }

    fn build(list: &[i32]) -> Option<Box<ListNode>> {
        let mut head = None;
        for i in (0..list.len()).rev() {
            head = Some(Box::new(ListNode {
                data: list[i],
                next: head,
            }));
        }
        head
    }
}

impl fmt::Debug for ListNode {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let mut p = Some(self);
        while let Some(node) = p {
            write!(f, "{}->", node.data)?;
            p = node.next.as_ref().map(|x| x.as_ref());
        }
        write!(f, "<nil>")
    }
}

fn add_two_numbers(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
    let mut dummy_head = ListNode::new(0);
    let mut p = &mut dummy_head;
    let mut p1 = l1.as_ref();
    let mut p2 = l2.as_ref();
    let mut carry = 0;
    while p1.is_some() || p2.is_some() {
        let mut sum = carry;
        if let Some(node) = p1 {
            sum += node.data;
            p1 = node.next.as_ref();
        }
        if let Some(node) = p2 {
            sum += node.data;
            p2 = node.next.as_ref();
        }
        carry = sum / 10;
        p.next = Some(Box::new(ListNode::new(sum % 10)));
        p = p.next.as_mut().unwrap();
    }
    if carry > 0 {
        p.next = Some(Box::new(ListNode::new(carry)));
    }
    dummy_head.next
}

fn main() {
    let l1 = ListNode::build(&[2, 4, 3]);
    let l2 = ListNode::build(&[5, 6, 4]);
    println!("{:?}", l1);
    println!("{:?}", l2);
    println!("{:?}", add_two_numbers(l1, l2));

    let l1 = ListNode::build(&[9,9,9,9,9,9,9]);
    let l2 = ListNode::build(&[9,9,9,9]);
    println!("{:?}", l1);
    println!("{:?}", l2);
    println!("{:?}", add_two_numbers(l1, l2));
}

代码3: 递归法

use std::fmt;

struct ListNode {
    data: i32,
    next: Option<Box<ListNode>>,
}

impl ListNode {
    fn new(data: i32) -> Self {
        ListNode { data, next: None }
    }

    fn build(list: &[i32]) -> Option<Box<ListNode>> {
        let mut head = None;
        for i in (0..list.len()).rev() {
            head = Some(Box::new(ListNode {
                data: list[i],
                next: head,
            }));
        }
        head
    }
}

impl fmt::Debug for ListNode {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let mut p = Some(self);
        while let Some(node) = p {
            write!(f, "{}->", node.data)?;
            p = node.next.as_ref().map(|x| x.as_ref());
        }
        write!(f, "<nil>")
    }
}

fn add_two_numbers(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
    add_helper(l1.as_ref(), l2.as_ref(), 0)
}

fn add_helper(l1: Option<&Box<ListNode>>, l2: Option<&Box<ListNode>>, carry: i32) -> Option<Box<ListNode>> {
    if l1.is_none() && l2.is_none() && carry == 0 {
        return None;
    }
    let mut sum = carry;
    if let Some(node) = l1 {
        sum += node.data;
    }
    if let Some(node) = l2 {
        sum += node.data;
    }
    let mut node = ListNode::new(sum % 10);
    node.next = add_helper(l1.map(|x| x.next.as_ref()).flatten(), l2.map(|x| x.next.as_ref()).flatten(), sum / 10);
    Some(Box::new(node))
}

fn main() {
    let l1 = ListNode::build(&[2, 4, 3]);
    let l2 = ListNode::build(&[5, 6, 4]);
    println!("{:?}", l1);
    println!("{:?}", l2);
    println!("{:?}", add_two_numbers(l1, l2));

    let l1 = ListNode::build(&[9,9,9,9,9,9,9]);
    let l2 = ListNode::build(&[9,9,9,9]);
    println!("{:?}", l1);
    println!("{:?}", l2);
    println!("{:?}", add_two_numbers(l1, l2));
}

输出:

2->4->3-><nil>
5->6->4-><nil>
7->0->8-><nil>
9->9->9->9->9->9->9-><nil>
9->9->9->9-><nil>
8->9->9->9->0->0->0->1-><nil>


3. 无重复字符的最长子串 Longest substring without repeating characters

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • 0 <= s.length <= 5 * 10^4
  • s 由英文字母、数字、符号和空格组成

代码1: 滑动窗口

use std::collections::HashSet;
fn length_of_longest_substring(s: String) -> i32 {
    let s = s.as_bytes();
    let mut set = HashSet::new();
    let mut left = 0;
    let mut right = 0;
    let mut max_len = 0;
    while right < s.len() {
        if !set.contains(&s[right]) {
            set.insert(s[right]);
            right += 1;
            max_len = max_len.max(right - left);
        } else {
            set.remove(&s[left]);
            left += 1;
        }
    }
    max_len as i32
}

fn main() {
    let str = String::from("abcabcbb");
    println!("{}", length_of_longest_substring(str));

    let str = "bbbbb".to_string();
    println!("{}", length_of_longest_substring(str));

    let str = "pwwkew".to_string();
    println!("{}", length_of_longest_substring(str));
}

代码2: 动态规划

fn length_of_longest_substring(s: String) -> i32 {
    let s = s.as_bytes();
    let mut dp = vec![0; s.len()];
    let mut max_len = 0;
    for i in 0..s.len() {
        if i == 0 || !s[0..i].contains(&s[i]) {
            dp[i] = if i == 0 { 1 } else { dp[i-1] + 1 };
        } else {
            let last_pos = s[0..i].iter().rposition(|&x| x == s[i]).unwrap();
            dp[i] = i - 1 - last_pos + 1;
        }
        max_len = max_len.max(dp[i]);
    }
    max_len as i32
}

fn main() {
    let str = String::from("abcabcbb");
    println!("{}", length_of_longest_substring(str));

    let str = "bbbbb".to_string();
    println!("{}", length_of_longest_substring(str));

    let str = "pwwkew".to_string();
    println!("{}", length_of_longest_substring(str));
}

代码3: 双指针

fn length_of_longest_substring(s: String) -> i32 {
    let s = s.as_bytes();
    let mut last_pos = vec![-1; 256];
    let mut left = 0;
    let mut right = 0;
    let mut max_len = 0;
    while right < s.len() {
        if last_pos[s[right] as usize] < left as i32 {
            last_pos[s[right] as usize] = right as i32;
            right += 1;
            max_len = max_len.max(right - left);
        } else {
            left += 1;
        }
    }
    max_len as i32
}

fn main() {
    let str = String::from("abcabcbb");
    println!("{}", length_of_longest_substring(str));

    let str = "bbbbb".to_string();
    println!("{}", length_of_longest_substring(str));

    let str = "pwwkew".to_string();
    println!("{}", length_of_longest_substring(str));
}

输出:

3
1
3


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/21010.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

内网渗透(七十八)之域权限维持之ACL滥用(下)

ACL滥用(下) 7、GenericAll 权限 应用于组 再来看看GenericAll 权限 应用于组如何进行权限维持。 由于用户hack是普通的域用户,因此他没有往Domain Admins 组添加用户的权限,如图所示,以用户hack 身份往Domain Admins 组中添加用户,可以看到,添加用户失败。 现在我们…

孙鑫VC++第四章 2.简单绘图-绘制

目录 1. 按键消息 2. 绘制线条 2.1 利用SDK全局函数实现画线功能 2.2 利用MFC的CDC类实现画线功能 2.3 利用MFC的CClientDC类实现画线功能 2.4 利用MFC的CWindowDC类实现画线功能 3. 在桌面窗口中画线 3.1 绘制彩色线条 4. 使用画刷绘图 4.1 简单画刷 4.2 位图画刷 …

『手撕 Mybatis 源码』02 - 加载配置文件

加载配置文件 获取输入流 myBatis 的配置文档层次架构 首先从读入开始查看是怎么加载配置文件的&#xff0c;现在从这里打个断点 public class MybatisTest {Testpublic void test1() throws IOException {// 1. 通过类加载器对配置文件进行加载&#xff0c;加载成了字节输入…

代码随想录算法训练营第二十三天|理论基础 77. 组合

文章目录 理论基础77.组合思路代码总结 理论基础 回溯算法&#xff1a;一种暴力搜索方式 回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 回溯法&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题…

学术加油站|基于LSM-tree存储系统的内存管理,最大限度降低I/O成本

本文系北京理工大学科研助理牛颂登所著&#xff0c;本篇也是 OceanBase 学术系列稿件第 10 篇。欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 「牛颂登&#xff1a;北京理工大学科研助理&#xff0c;硕士期间在电子科技大学网络空间安全研究院从…

antd-vue-admin——通过链接跳过登录页直接进入系统内部——基础积累

最近在写后台管理系统&#xff0c;遇到一个需求&#xff0c;就是从系统A带参数可以直接进入到系统B内部。不通过系统B的登录页面进行登录。 一般系统的登录&#xff0c;都需要用户名和密码等参数&#xff0c;然后获取到token信息&#xff0c;最后进入到系统内部。 下面介绍具…

4. QT中的鼠标键盘事件 --- 鼠标拖拽案例

1. 说明 在QT的控件或者窗口当中&#xff0c;如果对于当前鼠标或者键盘的功能需要自己定义&#xff0c;可以重写父类当中对应虚函数&#xff0c;主要包括以下几个&#xff1a; //键盘按键按下 virtual void keyPressEvent(QKeyEvent *event); //键盘按键抬起 virtual void ke…

linux 常用命令awk

AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&#xff0c;Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 AWK用法 awk 用法&#xff1a;awk pattern {action} files 1.RS, ORS, F…

【c语言】组件化打包—静态库lib

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

CVE-2023-32233 Linux kernel

0x01 漏洞介绍 近日&#xff0c;研究人员发现了Linux内核的NetFilter框架中的新漏洞&#xff08;CVE-2023-32233&#xff09;。该漏洞可被本地用户用于将权限提升为root&#xff0c;并完全控制系统。问题的根源在于tfilter nf_tables是如何处理批处理请求的&#xff0c;经过身…

AutoSizer.exe:自动调整窗口大小的便捷工具

AutoSizer.exe是一款实用的桌面应用程序,它旨在帮助用户自动调整窗口大小,提供更好的用户体验。无论您是在使用Windows操作系统进行日常工作还是进行多任务处理,AutoSizer.exe可以简化您的工作流程,提高效率。本文将介绍AutoSizer.exe的下载地址、功能介绍、使用方法以及其…

为世界第一大癌症高效研发首创新药,AI大模型助力药物研发叩开未来之门

近日&#xff0c;三位高中生引爆了医药圈&#xff0c;他们使用人工智能&#xff08;AI&#xff09;引擎进行靶点发现&#xff0c;确定了多形性胶质母细胞瘤&#xff08;GBM&#xff09;的新治疗靶点&#xff0c;多形性胶质母细胞瘤&#xff08;GBM&#xff09;是最具侵袭性和最…

238:vue+openlayers绘制扩展,弓形、曲线、扇形、双箭头、进攻方向...

第238个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中利用ol-plot插件进行绘制图形扩展,可以绘制弓形、弧形、标志旗、战斗进攻图形等等。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他…

【Shell脚本】Linux安装Nginx以及开机自启

目录 一、Linux安装Nginx脚本1、把编写好的安装Nginx脚本放置到nginx.sh文件中2、在检查网络的时候&#xff0c;这里的IP地址&#xff0c;填写的需要安装Nginx服务器的IP地址3、这里的端口号可按照自己的需要进行修改4、安装Nginx脚本 二、Nginx开机自启 一、Linux安装Nginx脚本…

Spring【Again】——复杂POJO的绑定

简单介绍&#xff1a; Again系列是将之前的内容我认为做的不好的地方或者是理解不到位的地方再来一次&#xff0c;加深记忆或者改错。我们就在来复习一下之前我们说过的复杂类型的数据绑定。 先来复习一下简单数据绑定&#xff1a; 简单数据绑定就是我们在传递参数的时候&am…

玩转ChatGPT:快速制作PPT

一、写在前面 首先还是让小Chat推销下自己&#xff1a; 你是否曾经为制作 PPT 而烦恼&#xff1f;现在有了 ChatGPT&#xff0c;再也不必担心灵感枯竭啦&#xff01;使用 ChatGPT 撰写 PPT 可以让你轻松地组织思路、快速得到内容&#xff0c;无需任何营销口号&#xff0c;Cha…

C++模板类与继承

目录 分类 一、模板类不继承 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 &#xff08;3&#xff09;运行结果 二、模板类继承普通类 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 &#xff08;3&#xff09;运行结果 三、普通类继…

Win11校园网不弹出登录页面怎么回事?

Win11校园网不弹出登录页面怎么回事&#xff1f;最近有用户在使用校园网的时候遇到了一些问题&#xff0c;访问登录网站的时候&#xff0c;一直无法显示登录的界面。那么遇到这个情况如何去进行解决呢&#xff1f;一起来看看以下的解决方法分享吧。 解决方法如下&#xff1a; 方…

nodejs处理xlsx文件生成json文件

nodejs处理xlsx文件有好几种方式&#xff0c;这里用的是js-xlsx库&#xff1b; 需求 有一个 xlsx 的文件&#xff0c;里面有几个不同的 sheet&#xff0c;需要读取这个表格中不同 sheet 的数据&#xff0c;并且为每个 sheet 生成对应的 json 文件。 例如有一个名为 template…

文本三剑客之——Awk

Awk Awk简介Awk语法格式Awk常见内置变量Awk实例演示按行输出文本BEGIN模式和END模式按字段输出文本通过管道&#xff0c;双引号调用shell命令date 的用法getline的用法awk数组 Awk简介 Awk是一个功能强大的编辑工具&#xff0c;用于在Linux/UNIX 下对文本和数据进行处理。数据…