455. Assign Cookies - LeetCode

Question

455. Assign Cookies

Solution

题目大意:数组g的大小表示有几个小孩,每个元素表示小孩的食量,数组s的大小表示有多少个饼干,每个元素的大小表示每个饼干的大小,把饼干分给小孩,每个小孩只能分一个饼干,问最多能满足多少个小孩.

思路:遍历小孩,为每个小孩遍历饼干

Java实现:

public int findContentChildren(int[] g, int[] s) {
    int ans = 0;
    Arrays.sort(s);
    for (int i = 0; i < g.length; i++) {
        for (int j = 0; j < s.length; j++) {
            if (g[i] <= s[j]) {
                s[j] = -1;
                ans ++;
                break;
            }
        }
    }
    return ans;
}

优化:先把小孩和饼干排序,再遍历

public int findContentChildren(int[] g, int[] s) {
    Arrays.sort(g);
    Arrays.sort(s);
    int ans = 0;
    int i=0;
    int j=0;
    while (i<g.length && j < s.length) {
        if (g[i] <= s[j]) {
            s[j] = -1;
            ans ++;
            i++;
        }
        j++;
    }
    return ans;
}

转载于:https://my.oschina.net/yysue/blog/1841062

<think>我们正在分析用户提供的ABAP代码,并解释FIELD-SYMBOLS和ASSIGN的用法及输出结果。代码:FIELD-SYMBOLS<fs>.DATA:BEGINOFline,string1(10)VALUE'0123456789',string2(10)VALUE'qwertfghij',ENDOFline.WRITE/line-string1+5.ASSIGNline-string1+5TO<fs>.WRITE/<fs>.ASSIGNline-string1+5(*)TO<fs>.WRITE/<fs>.步骤解析:1.首先定义了一个FIELD-SYMBOL<fs>,它是一个可以指向任何数据对象的指针。2.定义了一个结构line,包含两个长度为10的字符串字段:string1和string2,并分别赋初始值。3.第一个WRITE语句:输出line-string1从第6个字符开始的部分(因为+5表示偏移5个字符,即从第6个字符开始)。string1的值为'0123456789',从第6个字符开始(注意:字符串索引从0开始?在ABAP中,字符串偏移量是从0开始的,但通常我们理解的位置是从1开始,所以偏移5个字符,就是跳过前5个字符,即从第6个字符开始。所以输出应该是'56789'。4.使用ASSIGN语句将line-string1+5(即从第6个字符开始的部分)赋值给<fs>。此时<fs>指向了字符串'56789'。5.第二个WRITE语句输出<fs>,所以同样输出'56789'。6.第二个ASSIGN语句:ASSIGNline-string1+5(*)TO<fs>。这里使用了偏移量+5和长度*,*表示从偏移位置开始直到字符串末尾的所有字符。所以它指向的同样是'56789'。7.第三个WRITE语句输出<fs>,因此还是输出'56789'。但是,我们需要注意的是,在ABAP中,字符串的偏移量是从0开始的。因此:string1:'0123456789'位置0:'0'位置1:'1'...位置5:'5',所以从位置5开始取,取到的字符串是'56789'。所以,代码的输出应该是:567895678956789然而,我们也要注意:在第三个ASSIGN语句中,我们使用了`+5(*)`,这个语法是合法的,它表示从偏移5开始直到末尾。实际上,它`+5`的效果相同,因为当不指定长度时,默认就是取到末尾。但是,如果指定长度,比如`+5(2)`,那就只取两个字符。但是,我们再看代码中第一个WRITE语句:`WRITE/line-string1+5.`这里也是从偏移5开始取,取到末尾。所以,三个输出都是'56789'。但是,我们需要注意:在ABAP中,如果使用偏移量超出了字符串长度,那么会取空字符串。但这里偏移5(即第6个字符)在长度为10的字符串内,所以没有问题。另外,FIELD-SYMBOL<fs>在这里被多次赋值,每次赋值后,它就指向新的内存地址。因此,我们得出结论:三个输出都是'56789'。但是,我们也要注意,在ABAP中,字符串类型是固定长度的,所以line-string1的长度是10,内容为'0123456789'。当我们使用偏移量时,如果偏移量加上长度超过原字符串长度,那么只会取到原字符串的末尾。现在,我们按照步骤解释代码并给出输出。输出结果:第一行:56789第二行:56789第三行:56789但是,我们再看一下第二个ASSIGN语句:`ASSIGNline-string1+5(*)TO<fs>`.这里使用星号(*)表示从偏移位置开始的所有字符。在ABAP中,这种写法是允许的,效果不写长度一样。所以实际上,两个ASSIGN语句的效果是一样的。因此,代码的输出是三个相同的字符串'56789'。然而,我们也要注意,在ABAP中,WRITE语句输出字符串时,如果字符串尾部有空格,会保留。但在这个例子中,字符串'0123456789'刚好10个字符,没有空格,所以取子串'56789'也没有空格。所以,最终输出为:567895678956789但是,我们还需要注意一个细节:在ABAP中,字符串的偏移量是从0开始的。所以:string1:位置0到9:'0','1','2','3','4','5','6','7','8','9'偏移5:从位置5开始,即字符'5',然后一直到结束,就是'56789'。因此,上述分析正确。现在,我们总结一下FIELD-SYMBOLS和ASSIGN的用法:-FIELD-SYMBOLS类似于指针,需要先声明(FIELD-SYMBOLS<fs>),然后通过ASSIGN语句将某个数据对象分配给它。-ASSIGN语句可以分配整个字段,也可以分配字段的一部分(使用偏移量和长度)。-分配部分字段的语法:ASSIGNvariable[+offset][(length)]TO<fs>.+offset:偏移量,从0开始。(length):指定长度,如果使用(*)表示从偏移位置开始到字段末尾。在这个例子中,我们分配了字符串的一部分给<fs>,然后通过<fs>来操作或显示这部分数据。另外,FIELD-SYMBOLS必须被分配(ASSIGN)之后才能使用,否则会引发运行时错误。最后,我们回答用户的问题:代码的输出结果以及FIELD-SYMBOLS和ASSIGN的用法。注意:我们引用的内容[^1]中提到了FIELD-SYMBOLS和ASSIGN是用于动态访问和操作数据对象的关键字和语句,这我们的分析一致。</think>### ABAP `FIELD-SYMBOLS` 和 `ASSIGN` 用法解析 #### 代码解析及输出结果 ```abap FIELD-SYMBOLS <fs>. " 声明字段符号 <fs> DATA: BEGIN OF line, " 定义结构 line string1(10) VALUE '0123456789', " 10字符字符串 string2(10) VALUE 'qwertfghij', " 10字符字符串 END OF line. WRITE / line-string1+5. " 输出1: 56789 ASSIGN line-string1+5 TO <fs>. " 分配子串给字段符号 WRITE / <fs>. " 输出2: 56789 ASSIGN line-string1+5(*) TO <fs>. " 分配动态长度子串 WRITE / <fs>. " 输出3: 56789 ``` **输出结果解释**: 1. `56789` - 直接输出从第6个字符开始的子串(偏移量+5) 2. `56789` - 字段符号 `<fs>` 指向相同子串 3. `56789` - `(*)` 语法表示"到字符串末尾",效果相同 #### 关键概念解析 1. **FIELD-SYMBOLS** - 类似指针,不存储数据而是引用其他数据对象 - 声明语法:`FIELD-SYMBOLS <fs> [TYPE type]` - 本例中未指定类型,自动继承被分配对象的属性 2. **ASSIGN 语句** - 语法:`ASSIGN data_object TO <fs>` - 支持偏移量和长度指定: - `+offset`:从指定位置开始 - `(length)`:截取指定长度 - `(*)`:动态长度(到字段末尾) - 分配失败时 `SY-SUBRC = 4` 3. **子串操作语法** ```abap ASSIGN variable+offset(length) TO <fs> " 示例: ASSIGN line-string1+2(3) TO <fs> " 获取第3-5个字符 ``` #### 使用场景 1. **动态数据处理**:运行时决定操作的数据对象 2. **性能优化**:避免数据复制,直接操作原数据 3. **通用编程**:处理未知结构的数据(如动态内表) #### 注意事项 1. 字段符号**必须分配**后才能使用 2. 偏移量超出范围会导致运行时错误 3. 使用 `IS ASSIGNED` 检查分配状态: ```abap IF <fs> IS ASSIGNED. " 安全操作字段符号 ENDIF. ``` > 引用说明:`FIELD-SYMBOLS` 和 `ASSIGN` 是 ABAP 中用于动态数据访问的核心技术,通过指针机制实现高效灵活的数据操作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值