This commit is contained in:
ranwenjie
2021-08-17 17:39:37 +08:00
parent 136b59671d
commit 1841228814
57 changed files with 15 additions and 21 deletions
@@ -0,0 +1,28 @@
#include "stdio.h"
char char_first_appear_once(const unsigned char *source){
int hash[256]={0};
char *tmp = source;
if (tmp == NULL) return '\0';
while(*tmp != '\0'){
hash[*tmp]++;
tmp++;
}
tmp = source;
while(*tmp != '\0'){
if (hash[*tmp] == 1) return *tmp;
tmp++;
}
return '\0';
}
int main(int argc, char const *argv[])
{
char *test = "77ah-ba-ccdeff";
char c = char_first_appear_once(test);
printf("c=%c\n", c);/* c = 'h'*/
return 0;
}
@@ -0,0 +1,35 @@
#include "stdio.h"
char *proc(char *str){
char *start = str;
char *end = str;
if (str == NULL) return NULL;
while(*end != '\0') end++;
end--;
while(start < end){
if (*start >= 'A' && *start <= 'Z'){//大写
if (*end >= 'a' && *end <= 'z'){
char tmp = *start;
*start = *end;
*end = tmp;
start++;
}
end--;
}else{//小写
if (*end >= 'A' && *end <= 'Z'){
end--;
}
start++;
}
}
return str;
}
int main(int argc, char const *argv[])
{
char test[] = "HaJKPnobAACPc";//"char *test" always make "28767 bus error"
printf("%s\n", proc(test));
return 0;
}
@@ -0,0 +1,32 @@
#include "stdio.h"
char *replace_blank(char *source){
int count = 0;
char *tail = source;
if (source == NULL) return NULL;
while(*tail != '\0'){
if (*tail == ' ') count++;
tail++;
}
while(count){
if(*tail != ' '){
*(tail+2*count) = *tail;
}else{
*(tail+2*count) = '0';
*(tail+2*count-1) = '2';
*(tail+2*count-2) = '%';
count--;
}
tail--;
}
return source;
}
int main(int argc, char const *argv[])
{
char str[100]="we are happy";
printf("ret=%s\n",replace_blank(str));
return 0;
}
@@ -0,0 +1,57 @@
#include "stdio.h"
void _reverse(char *start,char *end){
if ((start == NULL) || (end == NULL)) return;
while(start < end){
char tmp = *start;
*start = *end;
*end = tmp;
start++,
end--;
}
}
char *_revert_by_word(char *source){
char *end = source;
char *start = source;
while(*start != '\0'){
if (*start == ' '){
start++;
end++;
}else if(*end == ' ' || *end == '\0'){
_reverse(start,end-1);
start = end;
}else{
end++;
}
}
return source;
}
char *revert_by_word(char *source){
char *end = source;
char *start = source;
if (source == NULL) return NULL;
while (*end != '\0') end++;
end--;
/*整个句子逆序*/
_reverse(start,end);
/*按单词逆序.tneduts a ma I */
_revert_by_word(source);
return source;
}
//为啥运行时 bus error?
int main(int argc, char const *argv[])
{
char *test = "how are you ?";
printf("%s\n",_revert_by_word(test));
test = "I am a student.";
printf("%s\n",revert_by_word(test));
return 0;
}
@@ -0,0 +1,429 @@
#include "stdio.h"
typedef int BOOL;
#define YES 1
#define NO 0
// 反序
void revert(const char *source,char *dest){
const char *s = source;
char *end = dest;
while(*s){
*end++ = *s++; //先拷贝字符串
}
*end='\0';
end--;// 指向最后一个字符
while(end>dest){
char tmp = *end;
*end = *dest;
*dest = tmp;
end--;
dest++;
}
}
// 按单词逆向 如 this is a sentence 输出 sentence a is this
// 先按单词逆序,再对整个句子逆序
void revertByWord(const char *src, char *dest){
// 先拷贝字符串到dest
char *tmp = dest;
char *dest_end;
while(*src){
*tmp++ = *src++;
}
*tmp='\0';
dest_end = tmp-1; //这里留作下面用;
tmp = dest;
// 扫描一遍 dest,按单词逆序
char *start=dest-1,*end=dest;
while(*tmp){
if (*tmp == ' ')//逆序
{
start++;
//对单词逆向
while(end>start){
*start = *start + *end;
*end = *start - *end;
*start = *start - *end;
start++;
end--;
}
start=tmp;// 如果句子中又多个连续空格,也会对空格做逆序,浪费cpu
}
tmp++;
end=tmp-1;
}
if (!*tmp)//最后一个字符,对最后一个单词逆序
{
start ++;
while(end>start){
*start = *start + *end;
*end = *start - *end;
*start = *start - *end;
start++;
end--;
}
}
tmp = dest;
// 逆向整个句子
while(dest_end>tmp){
*tmp = *tmp + *dest_end;
*dest_end = *tmp - *dest_end;
*tmp = *tmp - *dest_end;
tmp++;
dest_end--;
}
}
// 回文,或 对称
BOOL symmetrical(const char *scr,int length){
const char *end = scr+length-1;
BOOL is=YES;
while(end>scr){
if (*scr++ != *end--)
{
is=NO;
}
}
return is;
}
//找出第一个只出现一次的字符,找不到就返回‘0’
char first_appear_only_once(const char *source){
// 建立hash表
const int length=256;
int hash_table[length];
for (int i = 0; i < length; ++i)
{
hash_table[i]=0;
}
//第一次扫描,建立hash表
const char *tmp = source;
while(*tmp){
hash_table[*tmp++]++;
}
// 第二次扫描
while(*source){
if(hash_table[*source]==1){
return *source;
}
source++;
}
// 没找到
if (!*source)
{
return '0';
}
return '0';
}
// 最大对称子串的长度
int max_symmetrical_char_length(const char *scr){
int max_symmetrical_length=1;
return 0;
}
// 找最大数字子串
int continumax(char *outputstr,char *intputstr){
return 0;
}
// 最大连续递增数字串
int continuousnum(const char *input, char *output){
return 0;
}
// 2个字符串的最长公共子串
int longest_common_subsequence(const char *s1,const char *s2, char *common){
return 0;
}
// 找子串
char *strstr(const char *haystack, const char * needle){
return NULL;
}
// 子串个数
char *sub_str_count(const char *src, const char *substr, int *count){
return NULL;
}
// 删除子串
char *delete(char *source,const char *del,BOOL greedy){
return NULL;
}
// 字符串拷贝
char *strcpy(const char *src,char *dest){
char *tmp = dest;
while(*src){
*dest++ = *src++;
}
*dest = '\0';
return tmp;
}
// aabcd & bcad , abc&bca
BOOL isBrother(const char *first,const char *secd){
return YES;
}
// 字符串就地压缩 如 “aaabcc” “a3bc2”
/*
注意连续字符大于9的情况
*/
void compress(char *src){
if (*src == NULL)
{
return;
}
int count = 1;
char *back=src,*forward=src+1;
while(*forward){
count = 1;
if (*forward == *back)
{
count++;
forward++;
}else{ //
if (count!=1)
{
back++;
*back=count;
}
}
}
*++back = '\0';
}
// 删除其中的数字并压缩,2个指针,一前一后
void filternum(char *src){
if (!*src)
{
return;
}
char *back=src ,*forward=src;
while(*forward){
if (*forward >= '0' && *forward <= '9')
{
forward++;
}else{
*back++ = *forward++;
}
}
*back='\0';
// 局部变量释放,不能作为返回值
}
// 删除字符串中的数字,不改变原串,同上
char *filternumber(const char*src,char *dest){
return NULL;
}
// 删除指定字符,不开辟空间
void delete_character(char *src , char target){
char *back=src,*forward = src;
while(*forward){
if (*forward == target)
{
forward++;
}else{
*back++ = *forward++;
}
}
*back = '\0';
}
// 统计文件中单词的出现的个数
void statistics(FILE *fd){
}
// 字符串中字符的所有排列
int main(int argc, char const *argv[])
{
// 反转
char *reverse = "nonstriater";
char reversed[20];
revert(reverse,reversed);
printf("%s after reverse : %s\n", reverse,reversed);
// 按单词逆序
char *sentence = "this is a sentence!"; // "this is a sentence"
char dest[50];
revertByWord(sentence,dest);
printf("%s revert by word: %s\n",sentence,dest );
// 回文
char symmetri[] = "dacbcacbcad";
printf("%s : %d\n", symmetri, symmetrical(symmetri,sizeof(symmetri)-1) );
char unsymmetrical[] = "aaacbdaa";
printf("%s : %d\n", unsymmetrical, symmetrical(unsymmetrical,sizeof(unsymmetrical)-1) );
// 第一次出现一次的字符
printf("%s第一次出现一次的字符是:%c\n",symmetri,first_appear_only_once(symmetri) );// '0'
printf("%s第一次出现一次的字符是:%c\n",unsymmetrical,first_appear_only_once(unsymmetrical) ); // 'c'
// 过滤数字
char *charnumber = "this is 58tongcheng12haha!";
//filternum(charnumber);
printf(" after filter: %s\n", charnumber );
// 过滤指定字符
//delete_character(charnumber,'i'); // 居然会出 bus error!!!!!????
printf("after filter:%s\n", charnumber);
return 0;
}