目录

1.字符串解密加密

2.字符串左旋

3.杨氏矩阵

4.删除字符串中出现次数最少的字符


好久不见,自从刷完剑指offer里面所有目前可以用C解决的题目吧之后,就在刷一些高校的题和华为机试题,一直在总结经验,今天给大家分享一下 我觉得很精彩的四个代码题,都是有一些思想在里面的

每日小细节也会陆续更新这些好题,保证大家一两分钟就会有收货

关注收藏不迷路哦

1.字符串解密加密

描述

对输入的字符串进行加解密,并输出。

加密方法为:

当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;

当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;

其他字符不做变化。

解密方法为加密的逆过程。

数据范围:输入的两个字符串长度满足 1 \le n \le 1000 \1≤n≤1000  ,保证输入的字符串都是只由大小写字母或者数字组成

其实我们发现这个没那么难,只是稍微麻烦一些

只需要输入两个字符串,然后把z Z a A 0 9这些单独拎出来就可以

//字符串加解密
#include <ctype.h>
#include <string.h>
#include <strdio.h>
int main()
{char arr[1001] = { '\0' };  //需要加密的char arr1[1001] = { '\0' }; //需要解密的while (scanf("%s%s",&arr,&arr1)==2){int len = strlen(arr);int len1 = strlen(arr1);//for (int i = 0; i < len; i++){if (isdigit(arr[i])){if (arr[i] == '9')arr[i] = 0;elsearr[i] += 1;}else if (isupper(arr[i])){arr[i] = tolower(arr[i]);if (arr[i] == 'z')arr[i] = 'a';elsearr[i] = arr[i] + 1;}else{arr[i] = toupper(arr[i]);if (arr[i] == 'Z')arr[i] = 'A';elsearr[i] = arr[i] + 1;}}//for (int i = 0; i < len1; i++){if (isdigit(arr1[i])){if (arr1[i] == '0')arr[i] = 9;elsearr[i] -= 1;}else if (isupper(arr1[i])){arr1[i] = tolower(arr1[i]);if (arr1[i] == 'a')arr1[i] = 'z';elsearr1[i] = arr1[i] - 1;}else{arr1[i] = toupper(arr1[i]);if (arr1[i] == 'A')arr1[i] = 'Z';elsearr1[i] = arr1[i] - 1;}}
printf("%s\n %s", arr,arr1);}}

注意这里我们把两个字符串初始化成'\0',只要我们不确定到底数组有多少元素,只知道一个范围,需要具体输入之后才知道  的时候,就可以这么做!!!会自动加上字符串的 \0

其次就是熟练的运用

islower,isupper,tolower,toupper,这些函数,还要注意他们的头文件<ctype.h>


2.字符串左旋

我们发现其实就是把每次把第一个字符单独拿来,然后剩下的字符全都前移一个位置,最后把刚才拿出来的字符放回最后一个位置

void reverse(char* arr, int number,int ans)
{ans %= number;while (ans--){char tmp = arr[0];//把元素往前挪一个for (int j = 0; j <number -1; j++){arr[j] = arr[j + 1];}arr[number -1] = tmp;}
}int main()
{char  arr[50] = { 0 };gets(arr);int target = 0;scanf("%d", &target);int len = strlen(arr);reverse(arr, len,target);printf("%s\n", arr);
}

但是这个真的好麻烦

万一给一个很长的字符串那就没什么运行的必要了

所以我们选择一个很巧妙的方法!!!!!!!!!!!!!!!

//但是刚才那个方法有点麻烦
void reverse(char* start, char* end){while (end - start > 0){char tmp = *start;*start = *end;*end = tmp;start++;end--;}}
int main()
{char  arr[50] = { 0 };gets(arr);int target = 0;scanf("%d", &target);int len = strlen(arr);target %= len;reverse(arr, arr + target-1);reverse(arr + target, arr + len - 1);reverse(arr, arr + len - 1);printf("%s\n", arr);
}

是不是有小可爱已经看出来了,我这个代码的意思

比如要旋转的次数是2 那我就把两个字符先倒序,把剩下的字符倒序

注意是原地倒序

最后再把整个字符串倒序!

倒序三次这个思想还是很重要的一定要掌握这个方法

其次就是把元素前移的方法很重要,下次再有类似的写法一定要倒写如流!!


3. 杨氏矩阵

(具体的代码题找不到了。。)

比如说这个二维数组

1 2 3

4 5 6

7 8 9

就是一个很简单的杨氏矩阵

我的第一思路是(0,0)和(2,2)分别是最小的最大的元素

先比较要找的元素和他俩的关系,但是然后中间过程就变得好麻烦........

其实完全没必要

只需要和(0,2)比较如果比他小,那么就还在第一行(这一行)里,只需要纵坐标--

如果比他大,那么就是下一行但是列数还是一致的

杨氏矩阵int juge(int arr[3][3], int x, int y, int target)
{int i = 0;int j = y-1;while (i <= x-1 && j >= 0){if (arr[i][j ] > target)j--;else if (arr[i][j ] == target)return 1;elsei++;}return 0;
}
int main()
{//int arr[10][10] = { 0 };int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };int r = 3;int l = 3;int target = 0;scanf("%d", &target);//scanf("%d%d", &r, &l);/*for (int i = 0; i < r; i++){for (int j = 1; j < l; j++){scanf("%d", arr[i][j]);}}*/int ret=juge(arr, r, l,target);if (ret)printf("YES\n");elseprintf("NO\n");
}

其实我这个写法只能看一下是不是真的在二维数组里面有这个元素

如果要求更加变态 如果找到了这个元素 返回坐标这么办???

不仅要告知是否找到,还要打印坐标
原来就有这个参数,但是我还是想把它改变之后返回来,所以用传参的方式
返回型参数
void  juge(int arr[3][3], int* x, int* y, int target)
{int i = 0;int j = *y - 1;int flag = 0;while (i <= *x - 1 && j >= 0){if (arr[i][j] > target)j--;else if (arr[i][j] == target){flag = 1;*x = i;*y = j;break;}elsei++;}if (!flag){*x = -1;*y = -1;}}
int main()
{//int arr[10][10] = { 0 };int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };int r = 3;int l = 3;int target = 0;scanf("%d", &target);//scanf("%d%d", &r, &l);/*for (int i = 0; i < r; i++){for (int j = 1; j < l; j++){scanf("%d", arr[i][j]);}}*/juge(arr, &r, &l, target);if (r==-1&&l==-1)printf("NO\n");elseprintf("YES %d %d\n",r,l);
}

方法二里面的传参型函数的方法很重要

还有用一个标记当做一个标签,根据需要设置成1/-1

函数返回的参数根据需要选择是不是要接收,不是必须要接收的!


4.删除字符串中出现次数最少的字符

这个方法把字符抽象成数字储存在数组,每次加加就是记录个数,把min设置成数字最小的那个,最后就是只要比min大的就输入
#include <stdio.h>
#include <string.h>
int main()
{char arr[21] = { 0 };gets(arr);int b[26] = { 0 };int len = strlen(arr);int min = 0;for (int i = 0; i < len; i++){b[arr[i] - 'a']++;  //其实这个就是比正常的字母表顺序提前一个从0开始}min = b[arr[0] - 'a'];  //把最小值设置为初始值for (int i = 0; i < len; i++){if (b[arr[i] - 'a'] <= min)min = b[arr[i] - 'a'];}for (int i = 0; i < len; i++){if (b[arr[i] - 'a'] > min)printf("%c", arr[i]);}
}

b[arr[i] - 'a'] ++;

这个步骤的思路太太太重要了!!!!!!!!!!

arr[i] - 'a'             把字符转换成字母表顺序的数字

b[arr[i] - 'a']         把数字放在数组b里面

b[arr[i] - 'a'] ++    每+一次就是把这个字符的个数+1


创作不易,感谢收看!!!!!!!!!

【C语言】字符串加密解密,字符串左旋,杨氏矩阵,删除字符串中出现次数最少的字符相关推荐

  1. 删除字符串中出现次数最少的字符

    在公交车上看一博客实现删除字符串中出现次数最少的字符,认为里面使用数组来作为hash很好,所以我就自己实现一遍. 要求:实现删除一个字符串中出现次数最少的字符.输出删除后的字符,要求安装原来顺序输出. ...

  2. JAVA----------------------华为机试--------------------------删除字符串中出现次数最少的字符...

    题目描述 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 输入描述: 字符串只包含小写英文字母, 不考虑非法输入,输 ...

  3. HJ23 删除字符串中出现次数最少的字符

    描述 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 注意每个输入文件有多组输入,即多个字符串用回车隔开 输入描述: ...

  4. 删除出现次数最少字符串JAVA_牛客网——华为机试(题23:删除字符串中出现次数最少的字符)(Java)...

    题目描述: 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 输入描述: 字符串只包含小写英文字母, 不考虑非法输入, ...

  5. 华为机试HJ23:删除字符串中出现次数最少的字符

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单 ...

  6. 删除字符串中出现次数最少的字符,汽水瓶,简单密码

    删除字符串中出现次数最少的字符 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 输入描述:字符串只包含小写英文字母, ...

  7. C++输入一个字符串,去掉这个字符串中出现次数最少的字符 例如: 输入:abcabbc 输出:bbb

    统计字符的个数,记录出现最少的字符,然后再输出 #include <iostream>using namespace std;int main() {char str[100];cin & ...

  8. 华为OJ——删除字符串中出现次数最少的

    "靠刷题学java" 题目描述 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 输入描述 字符串 ...

  9. java string 加密_java字符串加密解密

    java字符串加密解密 try { String test = "123456789@fdj.com"; EncryptionDecryption des = new Encryp ...

最新文章

  1. echarts学习文档
  2. php微信小程序物流进度推送,微信小程序 消息推送php服务器验证实例详解
  3. github使用个人总结
  4. 双端队列 HDOJ 3530 Subsequence
  5. java面向对象使用字符串_java面向对象中的String类中12种常用的方法
  6. 服务器控件HtmlTable下控件赋值问题
  7. Linux软件安装部署文档,MetaQ安装部署文档
  8. js 控制文件名与文件大小
  9. 移动前端适配方法总结
  10. 支援日本/厄瓜多尔震区 Skype推免费通话
  11. 敏捷落地的会议和工具
  12. python程序题库-python题库-Python,题库
  13. jquery audio在微信或者客户端需要点击两次才能正常播放的问题解决方案
  14. 《Spring5官方文档》新功能
  15. HDU 4234 Moving Points
  16. 【股票】融资融券基本概念
  17. mac系统ps快捷键大全-来自三人行慕课
  18. PHP靶向药,第三代靶向药已成功进入中国肺癌指南
  19. 男人,就要对自己下手狠一点
  20. UVa:10105 Polynomial Coefficients(多项式定理)

热门文章

  1. 机器学习之:流形与降维概述
  2. 手机端关闭微信浏览器
  3. Python 三角形第三边
  4. css基础选择器有哪些
  5. Python处理连接超时方法
  6. 简易的时间差计算(C语言)
  7. 「建议收藏」我想进阿里,我该怎么做?
  8. CTF-流量分析 [VN2020 公开赛]拉胯的三条命令 | SOLVED |
  9. Android 操作系统的内存回收机制之默认内存回收、OOM以及lowmemorykiller
  10. 网易招聘爬取 每日一练(四)