算法,3.30

1、You are given a binary tree in which each node contains an integer value.

Find the number of paths that sum to a given value.

The path does not need to start or end at the root or a leaf, but it must go downwards (traveling only from parent nodes to child nodes).

The tree has no more than 1,000 nodes and the values are in the range -1,000,000 to 1,000,000.

Example:
root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

  10
 /  \
5   -3

/ \
3 2 11
/ \
3 -2 1

Return 3. The paths that sum to 8 are:

  1. 5 -> 3
  2. 5 -> 2 -> 1
  3. -3 -> 11

解题思路:第一个我们可以使用暴力的dfs多重递归进行暴力求解,即判断结点下面还有没有子节点,有的话继续dfs深度搜索,但是由于递归层数很深,这样递归效率比较低,
第二个思路利用哈希表保存和记忆所有前面的二叉树结点之和,二叉树上面一条路径相当于一个一维数组,来寻找和为sum的连续子数组,这时来判断这条路径数组的前i项和与前j项和的差值是否为sum,如果为sum那么肯定有从这个前i项和到前j项和为sum的时候,每一次分支递归都需要更新当前路径上面的哈希表。
多重递归:
Python代码:

Definition for a binary tree node.

class TreeNode:

def init(self, x):

self.val = x

self.left = None

self.right = None

class Solution:
def pathSum(self, root: TreeNode, sum: int) -> int:
if not root:
return 0
return self.dfs(root,sum) + self.pathSum(root.left,sum) + self.pathSum(root.right,sum)#每次递归下一节点,寻找路径和为sum的
def dfs(self,root,path):
if not root:
return 0
path-=root.val
return (1 if path == 0 else 0) + self.dfs(root.left,path) + self.dfs(root.right,path)#如果path不为零的话继续往下面寻找

哈希表记忆和递归:
Python代码:

Definition for a binary tree node.

class TreeNode:

def init(self, x):

self.val = x

self.left = None

self.right = None

class Solution:
def pathSum(self, root: TreeNode, sum: int) -> int:
prefixSumTree = {0:1}
self.count = 0

    prefixSum = 0
    self.dfs(root, sum, prefixSum, prefixSumTree)
    
    return self.count
    
    
def dfs(self, root, sum, prefixSum, prefixSumTree):
    if not root:
        return 0
    prefixSum += root.val
    oldSum = prefixSum - sum
    if oldSum in prefixSumTree:#去检查曾经是不是有这个前i项和出现过,如果出现过那么肯定有从这个前i项到前j项距离为sum的时候,而且结点元素可能会有正有负,所以保存次数,可能还会不止一次两次
        self.count += prefixSumTree[oldSum]
    if prefixSum not in prefixSumTree:#将这个前n项和存入哈希表中
        prefixSumTree[prefixSum] = 1
    else:
        prefixSumTree[prefixSum] += 1
    
    self.dfs(root.left, sum, prefixSum, prefixSumTree)#将当前的哈希表传入到下面的递归函数中,保存了当前这条路径的前面的第i项和
    self.dfs(root.right, sum, prefixSum, prefixSumTree)
    
    prefixSumTree[prefixSum] -= 1#回到上一层父节点,自然本结点的值不能被包在prefixsum中

2、Given a string s that consists of only uppercase English letters, you can perform at most k operations on that string.

In one operation, you can choose any character of the string and change it to any other uppercase English character.

Find the length of the longest sub-string containing all repeating letters you can get after performing the above operations.

Note:
Both the string’s length and k will not exceed 104.

Example 1:
Input:
s = “ABAB”, k = 2

Output:
4

Explanation:
Replace the two 'A’s with two 'B’s or vice versa.

Example 2:
Input:
s = “AABABBA”, k = 1

Output:
4

Explanation:
Replace the one ‘A’ in the middle with ‘B’ and form “AABBBBA”.
The substring “BBBB” has the longest repeating letters, which is 4.

解题思路:使用头尾双指针和滑窗法,首先模拟出一个代表窗口内各个字符频度的26位的数组,循环遍历字符数组,每次循环都要在滑窗内找出频度最高的一个字符,看可不可以用k个字符直接替换掉其余的字符,如果可以得话,然后再保存这个滑窗的长度进入下一次循环,如果不可以直接替换的话,那么左指针加一,同时频度数组中的对应左指针的字符频度减去1,然后每次循环都用这次的窗口长度比较上一次的窗口长度,这样循环遍历字符串数组数组,最后得出的最大的滑窗长度就是这个替换后的最大的重复字符的长度。

纯c代码:
#define max(a,b) ((a)>(b)?(a):(b))
int maxmix(int* nums) {
int num = 0,maxn = 0,i;
for (i = 0;i<26;i++) {
num += nums[i];//统计频度总数
maxn = max(nums[i],maxn);//找出最大的字符频度
}
return (num-maxn);//返回的是滑窗内的不重复字符的数量
}
int characterReplacement(char * s, int k){
if (!s) {
return 0;//防止空字符串情况
}
int alp[26] = {0};//初始化频度表全部为0
int left = 0,right = 0;//初始化双指针
int last = 0;//最后输出
int len = strlen(s);
for (right = 0;right<len;right++) {//先使用右指针循环,扩大滑窗大小
alp[s[right]-‘A’]++;//频度表加1
while (maxmix(alp)>k) {//当不重复的元素大于能够替换的最大次数时,停止扩大窗口长度并开始缩小窗口长度直到不重复元素的频度小于等于k值为止
alp[s[left]-‘A’]–;
left++;
}
last = max((right-(left-1)),last);
}
return last;
}

### 回答1: wosa/xfs是一个用于自动化设备的通信标准。在3.30版本中,它提供了一套功能齐全且稳定的API(应用程序编程接口),使开发者能够更轻松地与自动设备进行通信和交互。 首先,wosa/xfs 3.30具有灵活性和可移植性。它支持跨多个操作系统平台和硬件架构的开发,因此开发者可以使用一套API,而不用针对每个不同的设备和操作系统做特定的开发。这使得开发过程更加高效和简化。 其次,wosa/xfs 3.30提供了丰富的功能和服务。它支持各种自动设备,如取款机、自动售货机和票据打印机等。开发者可以使用API来控制设备的各种功能,如卡片读取、钞票存取、密码输入和交易记录等。这样,开发者可以根据自己的需求进行灵活的设备控制和交互。 此外,wosa/xfs 3.30还提供了安全性和可靠性。它支持加密通信和身份验证,确保与设备之间的通信是安全的。同时,它还具备错误处理和故障恢复机制,以提供可靠的操作和数据保护。 最后,wosa/xfs 3.30还提供了广泛的开发支持和资源。开发者可以访问官方文档、示例代码和开发工具,以便更好地理解和应用API。同时,还有社区和论坛等资源可以共享经验和解决问题。 总之,wosa/xfs 3.30是一个功能强大、稳定可靠的通信标准,为开发者提供了便捷的设备控制和交互方式。它的灵活性、安全性和开发支持使得自动化设备的开发变得更加高效和可靠。 ### 回答2: WOSA/XFS 3.30是一种用于现金自动化设备(例如ATM、自动存取款机等)的应用程序接口标准。WOSA代表“Windows Open Services Architecture”,XFS代表“eXtensions for Financial Services”,3.30则代表版本号。 WOSA/XFS 3.30的主要目标是提供一个统一的接口,使不同厂商生产的现金自动化设备能够以统一的方式与计算机进行通信。这标志着整个行业向更加开放和互操作的方向发展。通过遵循WOSA/XFS 3.30标准,厂商可以更容易地开发自己的现金自动化设备,并能够更好地与其他系统和设备进行集成。 WOSA/XFS 3.30提供了一组定义了交互规则和命令格式的API接口,用于管理和控制现金自动化设备。它包括了各种操作现金的功能,例如现金存取、查询余额、打印交易凭条等。通过这些API,应用程序开发人员可以更轻松地实现与现金自动化设备的交互,并能够更好地满足用户的需求。 WOSA/XFS 3.30还提供了一套错误处理机制和事件通知机制,以便应用程序可以及时地处理设备故障和其他问题,并能够在必要时向用户提供恰当的提示和帮助。 总而言之,WOSA/XFS 3.30是一种应用程序接口标准,用于现金自动化设备的管理和控制。它提供了一组API接口,使厂商能够更容易地开发现金自动化设备,并能够与计算机和其他设备进行更好的集成。它还提供了错误处理和事件通知机制,以保障系统的可靠性和用户的便利性。 ### 回答3: wosa/xfs 3.30是一种金融领域的软件标准,用于自动化柜员机(ATM)和其他金融设备的技术交互。WOSA(Windows Open Services Architecture)是一个基于Windows操作系统的开放式服务架构,而XFS(eXtensions for Financial Services)则是为WOSA开发的一组标准接口和协议。WOSA/XFS 3.30是该标准的一个特定版本。 WOSA/XFS 3.30具有以下主要特点: 1. 可扩展性:WOSA/XFS 3.30通过定义一套标准接口,使不同供应商的硬件设备和软件系统能够在统一的平台上进行集成。这种可扩展性使金融机构更容易选择和集成不同供应商的设备,提高了系统的灵活性和互操作性。 2. 安全性:WOSA/XFS 3.30采用了严格的安全措施来保护金融交易的机密性和完整性。它支持各种安全协议和加密算法,确保数据在传输和存储过程中的安全性。 3. 故障恢复:WOSA/XFS 3.30具有自动故障恢复的功能。当设备出现故障或中断时,它能够自动检测并采取相应的恢复措施,确保金融服务的持续可用性和准确性。 4. 管理性:WOSA/XFS 3.30提供了一套完整的管理接口和工具,用于监控和管理金融设备。这些接口和工具可以帮助金融机构实时监控设备状况、进行故障排查和维护,提高设备的可靠性和性能。 总之,WOSA/XFS 3.30是一种功能强大的金融设备标准,为金融机构提供了一个可靠、灵活和安全的软件平台,以实现自动化柜员机和其他金融设备的高效运行和交互。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值