[leetcode] 91.Decode Ways

题目:
A message containing letters from A-Z is being encoded to numbers using the following mapping:

‘A’ -> 1
‘B’ -> 2

‘Z’ -> 26

Given an encoded message containing digits, determine the total number of ways to decode it.

For example,
Given encoded message “12”, it could be decoded as “AB” (1 2) or “L” (12).

The number of ways decoding “12” is 2.
题意:
字符A—-Z对应的数字是1-26。给定一个数字字符串,判断一共有哪些字符的组成状况。比如“12“,对应的是“AB“或者“L“。
思路:
题目中可能会遇到一些无可能的数字,比如0,00,000之类的。
参照之前做的青蛙跳台阶的思路(即斐波拉切数列的思路),比如
11293:

  1. 初始时能够到达第一个数的可能有一种,即令num1=1。能够到达第二个1的可能性有两种,从第一个1往后一步,或者直接一步走两个1,即“11“。所以到达第二个1的可能有两种。初始化完毕。
  2. 从第三个数一直到最后一个数字,第三个数字2,能够从它前面的一个位置往后走一步到达,或者从离它两个位置的地方跳两格到达。但是也不一定能够到达,得看是否满足条件。比如能够从前一个位置一步到达,那么需要当前位置不是0。如果需要从两步远到达,那么需要当前位置的前一个位置与当前位置的这两个字符组合成的字符串在”10”到”26”之间。

以上。
代码如下:

class Solution {
public:
    int numDecodings(string s) {
        if(s.size() == 0 || s[0] == 0)return 0;
        int num1 = 1,num2 = 1;
        if(!valid(s[0]))num1 = 0;
        if(s.size() == 1){
            return num1;
        }
        if(!valid(s[1]))num1 = 0;
        if(!valid(s[0],s[1]))num2 = 0;
        if(s.size() == 2)return num1 + num2;
        if(valid(s[0]) && valid(s[1]))num2 += num1;

        int res = 0;
        for(int i = 2; i < s.size(); i++){
            res = 0;
            if(!valid(s[i]))res = 0;
            if(valid(s[i-1],s[i]))res += num1;
            if(valid(s[i]))res += num2;

            num1 = num2;
            num2 = res;
        }
        return res;
    }
    bool valid(char a){
        return (a >= '1' && a <= '9');
    }
    bool valid(char a,char b){
        return (a == '1' || a == '2' && b <= '6');
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,NURBS(非均匀有理B样条)是一种强大的数学工具,用于表示和处理复杂的曲线和曲面。NURBS在计算机图形学、CAD(计算机辅助设计)、CAM(计算机辅助制造)等领域有着广泛的应用。下面将详细探讨MATLAB中NURBS的绘制方法以及相关知识点。 我们需要理解NURBS的基本概念。NURBS是B样条(B-Spline)的一种扩展,其特殊之处在于引入了权重因子,使得曲线和曲面可以在不均匀的参数空间中进行平滑插值。这种灵活性使得NURBS在处理非均匀数据时尤为有效。 在MATLAB中,可以使用`nurbs`函数创建NURBS对象,它接受控制点、权值、 knot向量等参数。控制点定义了NURBS曲线的基本形状,而knot向量决定了曲线的平滑度和分布。权值则影响曲线通过控制点的方式,大的权值会使曲线更靠近该点。 例如,我们可以使用以下代码创建一个简单的NURBS曲线: ```matlab % 定义控制点 controlPoints = [1 1; 2 2; 3 1; 4 2]; % 定义knot向量 knotVector = [0 0 0 1 1 1]; % 定义权值(默认为1,如果未指定) weights = ones(size(controlPoints,1),1); % 创建NURBS对象 nurbsObj = nurbs(controlPoints, weights, knotVector); ``` 然后,我们可以用`plot`函数来绘制NURBS曲线: ```matlab plot(nurbsObj); grid on; ``` `data_example.mat`可能包含了一个示例的NURBS数据集,其中可能包含了控制点坐标、权值和knot向量。我们可以通过加载这个数据文件来进一步研究NURBS的绘制: ```matlab load('data_example.mat'); % 加载数据 nurbsData = struct2cell(data_example); % 转换为cell数组 % 解析数据 controlPoints = nurbsData{1}; weights = nurbsData{2}; knotVector = nurbsData{3}; % 创建并绘制NURBS曲线 nurbsObj = nurbs(controlPoints, weights, knotVector); plot(nurbsObj); grid on; ``` MATLAB还提供了其他与NURBS相关的函数,如`evalnurbs`用于评估NURBS曲线上的点,`isoparm`用于生成NURBS曲面上的等参线,以及`isocurve`用于在NURBS曲面上提取特定参数值的曲线。这些工具对于分析和操作NURBS对象非常有用。 MATLAB中的NURBS功能允许用户方便地创建、编辑和可视化复杂的曲线和曲面。通过对控制点、knot向量和权值的调整,可以精确地控制NURBS的形状和行为,从而满足各种工程和设计需求。通过深入理解和熟练掌握这些工具,可以在MATLAB环境中实现高效的NURBS建模和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值