每日一练 — 2021.12.13

本文介绍了三个编程问题的解决方案:1) 给定整数数组表示的非负整数加一;2) 通过递归实现全排列,处理重复数字;3) 使用滑动窗口找到字符串中无重复字符的最长子串。示例代码分别用Python和C++实现,并给出了详细的运行结果。
摘要由CSDN通过智能技术生成


一、加一

1,程序简介

  • 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
  • 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
  • 你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
  • 输入:digits = [1,2,3]
  • 输出:[1,2,4]
  • 解释:输入数组表示数字 123。
示例 2:
  • 输入:digits = [4,3,2,1]
  • 输出:[4,3,2,2]
  • 解释:输入数组表示数字 4321。
示例 3:
  • 输入:digits = [0]
  • 输出:[1]
提示:
1 <= digits.length <= 100
0 <= digits[i] <= 9

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Mon Dec 13 09:09:27 2021
Function:
@author: 小梁aixj
"""
class Solution(object):
    def plusOne(self, digits):
        ls = len(digits)
        for index in reversed(range(ls)):
            if digits[index] < 9:
                digits[index] += 1
                return digits
            else:
                digits[index] = 0
        digits.insert(0, 1)
        return digits
#%%
s = Solution()
print(s.plusOne(digits = [1,2,3])) #[1, 2, 4]
print(s.plusOne(digits = [4,3,2,1])) #[4, 3, 2, 2]
print(s.plusOne(digits = [0])) #[1]


3,运行结果

在这里插入图片描述


二、全排列 ||

1,程序简介

  • 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
  • 输入:nums = [1,1,2]
  • 输出:[[1,1,2], [1,2,1], [2,1,1]]
示例 2:
  • 输入:nums = [1,2,3]
  • 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10

以下程序实现了这一功能,请你填补空白处内容:
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
	vector<vector<int>> permuteUnique(vector<int> &nums)
	{
		vector<vector<int>> res;
		vector<bool> used(nums.size());
		sort(nums.begin(), nums.end());
		dfs(nums, used, res);
		return res;
	}
private:
	vector<int> stack;
	void dfs(vector<int> &nums, vector<bool> &used, vector<vector<int>> &res)
	{
		if (stack.size() == nums.size())
		{
			res.push_back(stack);
		}
		else
		{
			for (int i = 0; i < nums.size(); i++)
			{
				if (!used[i])
				{
					_____________________
					stack.push_back(nums[i]);
					used[i] = true;
					dfs(nums, used, res);
					stack.pop_back();
					used[i] = false;
				}
			}
		}
	}
};

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Mon Dec 13 09:10:30 2021
Function:
@author: 小梁aixj
"""
from typing import List
class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        ans = []
        if len(nums) == 0:
            return
        if len(nums) == 1:
            return [nums]
        for index,item in enumerate(nums):
            res = nums[:index]+nums[index+1:]
            for j in self.permuteUnique(res):
                ans.append(j+[item])
        rel = []
        for i in ans:
            if i not in rel:
                rel.append(i)
        return rel
#%%
s = Solution()
print(s.permuteUnique(nums = [1,1,2])) #[[1,1,2], [1,2,1], [2,1,1]]
print(s.permuteUnique(nums = [1,2,3])) #[[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]


3,运行结果

在这里插入图片描述


三、无重复字符的最长子串

1,程序简介

  • 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
  • 输入: s = “abcabcbb”
  • 输出: 3
  • 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
  • 输入: s = “bbbbb”
  • 输出: 1
  • 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
  • 输入: s = “pwwkew”
  • 输出: 3
  • 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
    请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
示例 4:
  • 输入: s = “”
  • 输出: 0
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

以下程序实现了这一功能,请你填补空白处内容:
int hset[128];
int lengthOfLongestSubstring(char *s)
{
	int i = 0, j = 0;
	int m = 0;
	memset(hset, 0, sizeof hset);
	for (; s[j]; j++)
	{
		___________________
	}
	return m;
}

2,程序代码

# -*- coding: utf-8 -*-
"""
Created on Mon Dec 13 09:11:33 2021
Function:
@author: 小梁aixj
"""
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        i = 0
        j = 0
        m = 0
        hset = {}
        while j < len(s):
            char = s[j]
            index = hset.get(char)
            if index is not None and index > i:
                i=index
            m = m if m > j-i+1 else j-i+1
            hset[char] = j+1
            j += 1
        return m
#%%
s=Solution()
print(s.lengthOfLongestSubstring('abcabcbb'))
print(s.lengthOfLongestSubstring('bbbbb'))
print(s.lengthOfLongestSubstring('pwwkew'))
print(s.lengthOfLongestSubstring(''))


3,运行结果

在这里插入图片描述


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁辰兴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值