一、Two Sum
题目大意:在数组中找到2个数字之和等于给定的数字,结果返回2个数字的数组下标。
例如:给定数组[2,7,11,15],目标值9,2+7=9,返回[0,1].。
思路:利用两个循环,第一个循环,用目标值减去当前数组值,用第二个循环在剩下的数组 值中寻找,是否存在。
void TwoSum(int input){
int target = input;
int arr[9] = {1,2,3,4,5,6,7,8,9};
int res = 0;
char flag = 0;
for(int i=0; i<9;i++){
res = target - arr[i];
for(int j=i+1; j<9;j++){
if(res == arr[j]){
printf("数组下标为:[%d,%d]\n",i,j);
flag +=1;
}
}
}
if(flag == 0){
printf("结果不存在\n");
}
}
二、Longest Substring Without Repeating Characters
题目大意:在一个字符串中寻找没有重复字母的最长字符串。
例如:“abcabcbb” 结果为abc,最长为3。
思路:设定两个下标left,right。left<right,利用i在left和right之间游走。当下标i的字符与下 标right的字符相同时,left加1,同时right加1。知道字符串遍历完成。类似于滑动窗口的算法。
void Findlongstring(void){
char arr[10] ; //必须输入10个字符
int left=0 ,right=0;
int max = 0;
int a,b,i;
printf("请输入字符串\n");
scanf("%s",arr);
while(right<sizeof(arr)){
if(left<right){
for(i=left;i<right;i++){ //i逐渐逼近right
if(arr[i]==arr[right]){ //两个字符相同时记录
if(max<right-left){
max = right-left;
a = left;
b = right;
}
left+=1;
break;
}
}
right+=1;
}else{
right +=1;
}
}
if(left == 0){
max = right-left;
a = left;
b = right;
}
printf("最长为:%d\n",max);
printf("字符串为:\n");
for(int j=a;j<b;j++){
printf("%c",arr[j]);
}
}
三、Reverse Integer
题目大意:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反 转。注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
例如:给定123,返回321。
void Reverse_num(void){
int val = 0;
printf("请输入一个整数\n");
scanf("%d",&val);
int res = 0;
while(val!=0){
res = res*10 + val%10; //除以10取余再乘以10
val = val/10; //原值除以10
}
if(res> 1<<(31-1) || res<-(1<<31)){
printf("ERROR\n");
}
printf("Reverse_num is %d:\n",res);
}
四、Palindrome
题目大意:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序
(从右向左) 读都是一样的整数。注意会有负数的情况,负数,个
位数,10 都不是回文数。其他的整数再按照回文的规则判断。
例如:121,是。-121,不是。
int IsPalindrome(void){
int val,tmp = 0;
int cnt = 0;
printf("请输入一个整数\n");
scanf("%d",&val);
tmp = val;
if(val<10){
printf("No\n");
return 0;
}
//确定几位数
while(val!=0){
val = val /10;
cnt+=1;
}
//存入数组
int arr[cnt]={0};
for(int i=0;i<cnt;i++){
arr[i] = tmp%10;
tmp =tmp/10;
}
for(int j=0;j<cnt;j++){
printf("%d ",arr[j]);
}
//前后相比较
for(int k=0;k<cnt/2;k++){
if(arr[k] != arr[cnt-1-k]){
printf("No\n");
return 0;
}
}
printf("Yes\n");
}
五、Container With Most Water
题目大意:给出一个非负整数数组 a1,a2,a3,...... an,每个整数标识一个竖立在
坐标轴 x 位置的一堵高度为 ai的墙,选择两堵墙,和 x 轴构成的容器可
以容纳最多的水。
例如:input[1,8,6,2,5,4,8,3,7]
output:49
void MaxArea(void){
int length,a;
int left=0,right=0;
int maxval,tmp;
int area=0;
int j = 0; //应该没用到
printf("请输入数组的大小\n");
scanf("%d",&length);
int arr[length] = {0};
printf("请输入数组值!\n");
for(int i=0;i<length;i++){
scanf("%d",&arr[i]);
}
for(left=0;left<length-1;left++){ //两个循环,类似于冒泡
for(right=left+1;right<length;right++){
if(arr[left]<arr[right]){ //取最小值
tmp = arr[left];
}else{
tmp = arr[right];
}
area = tmp*(right-left); //两个数之间的间距
if(area>maxval){
maxval=area;
}
}
}
printf("MaxArea is: %d\n",maxval);
}
六、Roman to Integer
題目大意:羅馬數字包含以下种字符:I,V,X,L,C,D和M。分别代表1,5,10,50,
100,500,1000。先给定一串罗马字符串,请将它用数字打印出来。例如:
输入 LVIII 输出:58。
思路:将给定的字符串存入字符数组中,通过遍历的方式将其转换成整型数组。组后进
行累加计算。需注意,通常情况下,罗⻢数字中小的数字在大的数字的右边。但
也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数
等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。
void RomanToInteger(void){
char arr[7] = {'I','V','X','L','C','D','M'};
int buf[7] = {1,5,10,50,100,500,1000};
int cnt = 0;
int sum = 0;
int z = 0;
char *p = (char*)malloc(1024);
printf("请输入字符串:\n") ;
gets(p);
int len = strlen(p);
printf("len: %d\n",len); //打印输入的字符串 长度
printf("p: %s\n",p); //打印输入的字符串
char str[len] = {0};
int tsrr[len] = {0};
strncpy(str,p,len);
// printf("str:%c\n",str[2]); //打印拷贝后的字符数组
for(int i=0;i<len;i++){
for(int j=0;j<7;j++){
if(str[i]==arr[j]){
tsrr[i] = buf[j];
}
}
}
while(z<len){
if((tsrr[z]<tsrr[z+1])&&(z+1<len)){ //防止下标越界
sum =sum + tsrr[z+1] - tsrr[z];
z+=2;
}else{
sum = sum + tsrr[z];
z= z+1;
}
}
printf("结果为:%d\n",sum);
if(p!=NULL){
free(p);
}
}