首页 > 其他分享 >(67)动态口令 (68)解码异或后的数组

(67)动态口令 (68)解码异或后的数组

时间:2024-03-30 16:32:20浏览次数:25  
标签:arr target int 异或 数组 67 68 encoded password

文章目录


每日一言

我们并不清楚,人类为何降生到这个世界;但我们可以试着去发现,这是一个什么样的世界。


题目(67)动态口令

题目链接:动态口令

某公司门禁密码使用动态口令技术。初始密码为字符串 password,密码更新均遵循以下步骤:

设定一个正整数目标值 target
将 password 前 target 个字符按原顺序移动至字符串末尾
请返回更新后的密码字符串。

  • 示例 1:
    输入: password = “s3cur1tyC0d3”, target = 4
    输出: “r1tyC0d3s3cu”

  • 示例 2:
    输入: password = “lrloseumgh”, target = 6
    输出: “umghlrlose”

提示:
1 <= target < password.length <= 10000


解题思路

  1. 写一个reverse 函数用于反转字符串中指定范围的字符。它接受一个指向字符数组的指针 p1,以及两个整型参数 pos1 和 pos2,分别表示反转范围的起始位置和结束位置。
  2. 在函数内部,使用一个临时变量 tmp 进行字符交换的操作,通过循环,不断将 pos1 和 pos2 所指向的字符进行交换,直到 pos1 不再小于 pos2。

总的来说就是:通过循环遍历,将字符串中指定范围内的字符实现反转。

在dynamicPassword函数中调用 reverse 函数来对密码进行反转操作:

  1. 首先对整个密码字符串进行反转
  2. 然后是从 0 到 len - target - 1 的部分反转
  3. 最后是从 len - target 到末尾的部分反转
  4. 最终将经过处理后的密码字符串返回

代码

void reverse(char *p1,int pos1,int pos2) {
    int tmp = 0;
    while(pos1 < pos2) {
        tmp = p1[pos1];
        p1[pos1] = p1[pos2];
        p1[pos2] = tmp;
        ++pos1;
        --pos2;
    }
}

char* dynamicPassword(char* password, int target) {
	//求字符串长度
    int len = strlen(password);
    //避免target过大导致重复左旋
    target = target % len;
    reverse(password, 0, len - 1);
    reverse(password, 0, len - target - 1);
    reverse(password, len - target, len - 1);
    return password;
}

题目(68)解码异或后的数组

题目链接:解码异或后的数组

未知 整数数组 arr 由 n 个非负整数组成。

经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。

给你编码后的数组 encoded 和原数组 arr 的第一个元素 first(arr[0])。

请解码返回原数组 arr 。可以证明答案存在并且是唯一的。

  • 示例 1:
    输入:encoded = [1,2,3], first = 1
    输出:[1,0,2,1]
    解释:若 arr = [1,0,2,1] ,那么 first = 1 且 encoded = [1 XOR 0, 0 XOR 2, 2 XOR 1] = [1,2,3]

  • 示例 2:
    输入:encoded = [6,2,7,3], first = 4
    输出:[4,2,0,7,4]

提示:
2 <= n <= 104
encoded.length == n - 1
0 <= encoded[i] <= 105
0 <= first <= 105


解题思路

做这道题要知道 n ^ m ^ n = m
题目说 encoded[i] = arr[i] ^ arr[i + 1] ,在等号两边同时按位异或arr[i] ,我们就得到了arr[i] ^ encoded[i] = arr[i] ^ arr[i + 1] ^ arr[i] , 它等价于 arr[i] ^ encoded[i] = arr[i + 1] ,即 arr[i + 1] = arr[i] ^ encoded[i]

以下是详细介绍

  1. 首先动态分配一个大小为 (encodedSize + 1) 的整型数组 arr ,用于存储解码后的数组。
  2. 将给定的 first 存入 arr[0]。
  3. 然后使用一个循环遍历数组 encoded,对每个元素进行解码操作:encoded[i] ^ arr[i],并将结果存入 arr[i + 1] 中。
  4. 最后将解码后数组的大小更新为 encodedSize + 1,并返回解码后的数组 arr。

按位异或的一些基本知识:

n ^ n = 0
n ^ 0 = n
消除:n ^m ^n = m
交换律:n ^ m = m ^ n
结合律:n ^ m ^ z = n ^ (m ^ z)

代码

int* decode(int* encoded, int encodedSize, int first, int* returnSize) {
    int *arr = (int*)malloc(sizeof(int)*(encodedSize + 1));
    arr[0] = first;

    for(int i = 0; i < encodedSize; i++) {
        arr[i + 1] = encoded[i] ^ arr[i];
    }

    *returnSize = encodedSize + 1;

    return arr;
}

结语

请给自己些耐心,不要急于求成。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

编程小白写作,如有纰漏或错误,欢迎指正


标签:arr,target,int,异或,数组,67,68,encoded,password
From: https://blog.csdn.net/qrwitu142857/article/details/137058264

相关文章

  • 1071 - Specified key was too long; max key length is 767 bytes
    1071-Specifiedkeywastoolong;maxkeylengthis767bytes问题背景问题分析处理问题背景今天在Mysql建表的过程中,遇到了一个这样的问题,错误信息1071-Specifiedkeywastoolong;maxkeylengthis767bytes下面来分析如何处理问题分析处理根据错误......
  • P2168 [NOI2015] 荷马史诗
    原题链接题解1.该题等价于构建一颗k叉树,每个叶子节点都有一个权值\(leaf_i\),树的权值为\(\sum_{1}^{n}leaf_i\),在使树的权值尽可能小的情况下,使最深的叶子节点的深度也尽可能小,即使数的高度尽可能小这个叫做哈夫曼树2.构建过程如下:每次从队列中取出\(k\)个节点,然后把他......
  • Luogu P6834 梦原 题解
    原题传送门首先考虑如果树的形态确定了之后的情况:如果当前点比爸爸的值大,那么显然爸爸变成\(0\)之后,这个点需要自己被额外操作删除,贡献就是\(a[v]-a[u]\)。类似,如果比爸爸的值小,那么这个点肯定会跟爸爸一起被删除,所以贡献就是\(0\)。综上所述,一个点的贡献是\(max{a[v]-......
  • P5367
    【模板】康托展开题目描述求$1\simN$的一个给定全排列在所有$1\simN$全排列中的排名。结果对$998244353$取模。对于$100%$数据,$1\leN\le1000000$。分析感觉康拓展开有点数位dp的影子捏。懒得写了#include<bits/stdc++.h>#defineintlonglongusingnamespace......
  • 蓝桥杯 2022 省A 选数异或
    一种比较无脑暴力点的方法,时间复杂度是(n²+m)。(注意==的优先级比^高,记得加括号(a[i]^a[j])==x)#include<iostream>#include<vector>#include<bits/stdc++.h>//包含一些C++标准库中未包含的特定实现的函数的头文件usingnamespacestd;intmain(){intn,......
  • 关于《完全手册Excel VBA典型实例大全——通过368个例子掌握》随书样例的下载
    按照早先下载的电子教程查看和编写vba,有些例子使用运行错误,想着看看原始文件。容易看到,网上有提供的doc或者pdf文档,都不完整,可能是{完全手册Excel_VBA典型实例大全:通过368个例子掌握}.{doc,pdf}这样命名的,139页或者134页的样子。搜索发现很多一些链接要么失效,要么是需要相应的积......
  • 智慧城市解决方案大全:标准规范顶层设计指南、整体解决方案、厂商售前宣讲PPT、招投标
    关键词:智慧城市,智慧城市解决方案,智慧城市发展的前景与趋势,智慧城市概念主力流出,智慧城市项目包括哪些方面,智慧城市项目方案,智慧城市宣传片,智慧城市白皮书,智慧城市政策在智慧城市的建设中,各种解决方案、标准规范、顶层设计指南等文档资料是不可或缺的参考资源。拥有一套全面、......
  • 瑞芯微-I2S | 音频驱动调试基本命令和工具-基于rk3568-2
    基于Linux嵌入式设备常用调试方法很多,本文一口君把调试语音用到的工具和方法给大家做一个简单的介绍。1.procfs、sysfsLinux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的......
  • 位运算-异或(^)
    1基本概念1.1符号异或是一种二进制的位运算,符号以XOR或^表示。1.2运算规则相同为0,不同为1,即(可以看做二进制下的不进位加法)1^1=00^0=01^0=11.3运算性质交换律:A^B=B^A结合律:(A^B)^C=A^(B^C)自反性:A^B^B=A(由结......
  • 【平台开发】MTK6833——add harware command queue function in lk
    CQE实现主要步骤(参考协议)Hostsystem结构commandqueue任务结构:2.TheoryofOperation(操作理论)init(初始化)初始化,enableCQ配置CQCFGTaskDescriptorsize配置CQTDLBA(CommandQueuingTaskDescriptorListBaseAddress)和CQTDLBAU(CommandQueuingTaskDe......