Telephone Number

本文介绍了一种用于验证11位手机号的有效性算法,特别关注以8开头的号码。通过删除非必要字符,检查字符串是否能转换为有效的电话号码格式。

A telephone number is a sequence of exactly 11 digits, where the first digit is 8. For example, the sequence 80011223388 is a telephone number, but the sequences 70011223388 and 80000011223388 are not.

You are given a string ss of length nn, consisting of digits.

In one operation you can delete any character from string ss. For example, it is possible to obtain strings 112, 111 or 121 from string 1121.

You need to determine whether there is such a sequence of operations (possibly empty), after which the string ss becomes a telephone number.

Input

The first line contains one integer tt (1t1001≤t≤100) — the number of test cases.

The first line of each test case contains one integer nn (1n1001≤n≤100) — the length of string ss.

The second line of each test case contains the string ss (|s|=n|s|=n) consisting of digits.

Output

For each test print one line.

If there is a sequence of operations, after which ss becomes a telephone number, print YES.

Otherwise, print NO.

Example
Input
2
13
7818005553535
11
31415926535
Output
YES
NO
Note

In the first test case you need to delete the first and the third digits. Then the string 7818005553535 becomes 88005553535

这道题就是判断11位的手机号,并且是以8开头;

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,k,i;
        cin>>n;
        char a[110];
        cin>>a;
        for(i=0;i<n;i++)
        {
            if(a[i]=='8')
            {
                k=i;//标记第一次出现8的位置
                break;
            }
        }
        if(n-i<11)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
    }
    return 0;
}

重点注意k的标记,后面if条件必须是n-i,一定不能是n-k,原因自己想想。。。。

 

转载于:https://www.cnblogs.com/ylrwj/p/10877665.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
<think>根据提供的代码片段,我们有两个部分:子页面和父页面。 子页面使用`defineEmits`定义了一个emit事件,事件名为'addtabIndex',并传递了一个对象参数,该对象包含一个属性`telephoneNumber`,其值为`dataObj.data.lParam`。 父页面中,使用了`watch`来监听`USBTelephonePackaging.value?.addtabIndex()`的变化。当子页面触发'addtabIndex'事件时,父页面的watch回调函数将会执行。 但是,这里存在一个问题:在Vue3中,`defineEmits`是在`<script setup>`中使用的,它返回一个`emit`函数,用于触发事件。而在父组件中,我们通常通过`@addtabIndex`来监听子组件发出的事件。但是这里父组件使用了`watch`来监听,并且监听的是一个组件的引用(`USBTelephonePackaging.value`)上的方法?这看起来不太符合常规。 让我们分析一下: 1. 子组件中,使用`defineEmits`定义了自定义事件,然后在某个地方(比如点击事件)调用了`emit('addtabIndex', { telephoneNumber: dataObj.data.lParam })`。 2. 父组件中,我们导入子组件`USBTelephonePackaging`,并在模板中使用它(代码未给出)。然后,我们使用`watch`来监听一个函数`USBTelephonePackaging.value?.addtabIndex()`。这里有几个问题: - `USBTelephonePackaging`是一个导入的组件对象,并不是一个组件实例。通常,我们在模板中使用组件,然后通过`ref`来获取组件实例。 - 在父组件中,我们可能通过`ref`给子组件实例命名,例如: ```javascript const usbTelephoneRef = ref(null); ``` 然后在模板中: ```html <USBTelephonePackaging ref="usbTelephoneRef" /> ``` - 然后,我们可以通过`usbTelephoneRef.value`来访问子组件实例。但是,子组件实例上并没有直接暴露`addtabIndex`方法,而是通过`emit`触发事件。所以,在子组件实例上,我们无法直接调用`addtabIndex`方法。 因此,父组件的监听方式可能不正确。正确的做法应该是: 父组件通过模板中的事件监听来捕获子组件的事件: ```html <USBTelephonePackaging ref="usbTelephoneRef" @addtabIndex="handleAddTabIndex" /> ``` 然后在父组件的methods或setup中定义`handleAddTabIndex`方法: ```javascript function handleAddTabIndex(val) { if (val?.telephoneNumber) { console.log(val.telephoneNumber); } console.log('新增标签页'); } ``` 但是,如果父组件中由于某种原因必须使用`watch`,那么我们需要重新设计。不过,通常事件监听不需要用`watch`,因为事件监听是主动触发的。 另一种可能的情况是,子组件通过`expose`暴露了一个方法,然后父组件通过ref调用这个方法,但这里子组件并没有暴露方法,而是触发事件。 所以,我怀疑父组件的代码意图是:当子组件触发事件时,执行某些操作。但当前父组件的写法无法达到目的。 因此,我建议修改父组件的代码,使用事件监听的方式。 但是,如果非要用`watch`,我们可以考虑在父组件中创建一个ref来存储事件参数,然后在子组件触发事件时更新这个ref,然后watch这个ref。但这样绕了弯路。 根据问题描述,我们可能没有完整的上下文,所以下面我将按照常规方式给出解决方案: 解决方案: 1. 子组件:定义emit事件并触发。 2. 父组件:在模板中绑定事件处理函数。 但是,如果父组件中使用了`ref`来引用子组件,并且想要在setup中使用watch来监听事件,我们可以这样做: - 在父组件中,创建一个ref变量,用于存储事件传递的值。 - 在子组件触发事件时,通过父组件的事件处理函数更新这个ref变量。 - 然后watch这个ref变量。 示例代码如下: 父组件: ```javascript import { ref, watch } from 'vue'; import USBTelephonePackaging from '@/components/USBTelephonePackaging.vue'; // 在模板中使用的ref const usbTelephoneRef = ref(null); // 用于存储事件数据的ref const tabIndexEventData = ref(null); // 事件处理函数 function handleAddTabIndex(val) { tabIndexEventData.value = val; } // 监听tabIndexEventData的变化 watch(tabIndexEventData, (newVal) => { if (newVal?.telephoneNumber) { console.log(newVal.telephoneNumber); } console.log('新增标签页'); }); // 注意:在模板中需要将事件处理函数绑定到子组件上 // <USBTelephonePackaging ref="usbTelephoneRef" @addtabIndex="handleAddTabIndex" /> ``` 但是,这样写实际上还是使用了事件处理函数,只是将事件数据转存到一个ref,然后用watch监听这个ref。这样做的好处是,可以将事件数据纳入响应式系统,并且可以在多个地方使用。 然而,根据问题中父组件的原始代码,它试图直接watch子组件实例上的一个方法,这是不正确的,因为子组件实例上并没有这个方法。 因此,我推断原始代码可能是想通过某种方式将子组件的事件转化为一个可监听的响应式数据。但直接监听一个函数调用(`USBTelephonePackaging.value?.addtabIndex()`)是不可行的,因为函数调用返回的是undefined(除非这个函数返回一个响应式数据,但这里并没有)。 所以,我建议按照常规事件处理方式,或者使用上述的转存ref的方式。 下面,我将给出一个完整的示例,包括子组件和父组件的代码。 子组件:USBTelephonePackaging.vue ```vue <script setup> // 定义事件 const emit = defineEmits(['addtabIndex']); // 假设在某个方法中触发事件 function someMethod() { // 模拟数据 const dataObj = { data: { lParam: '1234567890' } }; emit('addtabIndex', { telephoneNumber: dataObj.data.lParam }); } </script> ``` 父组件: ```vue <template> <USBTelephonePackaging @addtabIndex="handleAddTabIndex" /> </template> <script setup> import USBTelephonePackaging from '@/components/USBTelephonePackaging.vue'; function handleAddTabIndex(val) { if (val?.telephoneNumber) { console.log(val.telephoneNumber); } console.log('新增标签页'); } </script> ``` 如果父组件需要基于这个事件执行一些副作用(比如发起请求),并且想要利用Vue的响应式系统来watch,那么可以按照之前提到的转存ref的方式。 但是,如果问题中的原始代码是另一种设计思路(比如子组件通过某种方式暴露了一个可观察的状态),那么可能需要重新设计子组件。 由于问题描述有限,我按照常规事件处理方式给出解答。 如果确实需要在父组件中使用watch来监听,那么可以这样修改: 父组件: ```vue <template> <USBTelephonePackaging @addtabIndex="handleAddTabIndex" /> </template> <script setup> import { ref, watch } from 'vue'; import USBTelephonePackaging from '@/components/USBTelephonePackaging.vue'; // 创建一个ref来存储事件数据 const eventData = ref(null); function handleAddTabIndex(val) { // 将事件数据赋值给ref eventData.value = val; } // 监听eventData的变化 watch(eventData, (newVal) => { if (newVal?.telephoneNumber) { console.log(newVal.telephoneNumber); } console.log('新增标签页'); }); </script> ``` 这样,当子组件触发事件时,事件处理函数会将数据赋值给eventData,然后watch会检测到eventData的变化并执行回调。 总结:父组件原始代码中的watch监听方式不正确,需要改为事件监听,或者通过一个中间ref来存储事件数据,然后watch这个ref。 相关问题: 根据问题,最后需要提出四个相关问题。</think>### 解决方案 #### 问题分析 您提供的代码涉及 Vue 3 的父子组件通信: 1. **子组件**:使用 `defineEmits` 定义自定义事件 `addtabIndex`,并通过 `emit` 传递数据(`telephoneNumber`)。 2. **父组件**:使用 `watch` 监听子组件事件,但存在 **语法错误**: - `watch` 的第一个参数是函数 `() => ref.value?.event()`,但原始代码中 `USBTelephonePackaging.value?.addtabIndex()` 是**直接调用函数**而非返回监听源。 - 事件监听应使用 `@event` 或 `v-on`,而不是 `watch` 函数返回值。 --- ### 正确实现 #### 1. 子组件代码(USBTelephonePackaging.vue) ```vue <script setup> // 定义自定义事件 const emit = defineEmits(['addtabIndex']); // 触发事件的示例方法 function triggerEvent() { const dataObj = { data: { lParam: "13800138000" } // 模拟数据 }; // 发出事件并传递数据 emit('addtabIndex', { telephoneNumber: dataObj.data.lParam }); } </script> ``` #### 2. 父组件代码(正确事件监听) ```vue <template> <!-- 监听子组件的自定义事件 --> <USBTelephonePackaging ref="usbRef" @addtabIndex="handleAddTabIndex" /> </template> <script setup> import { ref } from 'vue'; import USBTelephonePackaging from '@/components/USBTelephonePackaging.vue'; // 方法:处理子组件事件 const handleAddTabIndex = (val) => { if (val?.telephoneNumber) { console.log('收到电话号码:', val.telephoneNumber); // 这里添加打开标签页的逻辑 } }; </script> ``` #### 3. 使用 `watch` 监听事件(替代方案) ```javascript import { ref, watch } from 'vue'; // 创建响应式变量存储事件数据 const tabEventData = ref(null); // 监听 tabEventData 的变化 watch(tabEventData, (newVal) => { if (newVal?.telephoneNumber) { console.log('监听到电话号码:', newVal.telephoneNumber); } }); // 在事件处理函数中更新响应式变量 const handleAddTabIndex = (val) => { tabEventData.value = val; // 触发 watch }; ``` --- ### 关键点解释 1. **子组件**: - `defineEmits` 声明自定义事件。 - `emit('eventName', payload)` 触发事件并传递数据。 2. **父组件**: - **模板监听**:使用 `@addtabIndex="handler"` 直接监听事件。 - **`watch` 替代方案**: - 通过响应式变量中转事件数据。 - `watch` 监听该变量的变化。 3. **原始代码问题**: - `watch(() => USBTelephonePackaging.value?.addtabIndex(), ...)` 试图监听函数返回值,但事件是异步触发的,无法直接通过函数返回值捕获。 --- ### 完整父组件示例 ```vue <template> <USBTelephonePackaging @addtabIndex="handleAddTabIndex" /> </template> <script setup> import USBTelephonePackaging from '@/components/USBTelephonePackaging.vue'; // 直接事件处理 const handleAddTabIndex = (val) => { if (val?.telephoneNumber) { console.log('电话号码:', val.telephoneNumber); // 打开新标签页的逻辑 } }; </script> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值