c语言入门100例七十七十四七十五题

#给你一个整数数组nums,请你找出nums子集按位或可能得到的最大值,并返回按位或能得到最大值的不同非空子集的数目
#对于一个n个元素,他的子集个数有2^n个,非空子集个数有2^n-1个

int countMaxOrSubsets(int *nums,int n){
int i,j;
int ans=0;
int max=0,cnt=0;
//1<n<2^n
for(i=0;i<(1<<n);i++){
ans=0;
for(j=0;j<n;j++){
if((1<<j)&i)
// i & (1<<j)则表示 i 和 1<<j(即2^j) 按位与后得到的数。1<<j的二进制表示只有第j个位置(从右往左数,从0开始)上的数是1,其余位置上的数是0,i和1<<j 进行按位与操作时,i的第j个位置是1就返回1<<j(判断语句中即为true),i的第j个位置是0就返回0(判断语句中即为false)
//具体地,

//当i=0时,任何j都不满足。

//当i=1时,j=0 满足条件。

//当i=2时,j=1 满足条件。

//当i=3时,j=0,1 满足条件。

//当i=4时,j=2 满足条件。

//当i=5时,j=0,2 满足条件。

//当i=6时,j=1,2 满足条件。

//当i=7时,j=0,1,2 满足条件。

//当i=8时,j=3 满足条件。


//当i=2^n-1时,j=0,1,2,...,n-1 满足条件。

//归纳一下,如果j表示数组a(长度为n)的索引,循环结构如下,则表示依次选取数组a的一个子数组进行操作,直到选到它本身。
{
ans|=nums[j];//子集进行或操作

}
if(ans>max){
max=ans;
cnt=1;
}else if(ans==max){
cnt++;
}
}
return cnt;
}

#实现一个函数。给你一个整数数组 digits,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。你需要找出 所有 满足下述条件且 互不相同 的整数:   该整数由 digits中的三个元素按任意顺序依次连接组成。该整数不含前导零。该整数是一个偶数。将找出的所有互不相同的整数按递增顺序排列,并以数组形式返回。

int *findEvenNumbers(int *digits,int digitsSize,int *retrunSize){
int hash[10];
int *ret=(*int)malloc(sizeof(int)*1000);
*returnSize=0;
int i,j,k;
memset(hash,o,sizeof(hash));
for(i=0;i<digitsSize;i++){
hash[digit[i]]++;
}
for(i=1;i<=9;i++){
for(j=1;j<=9;9++){
for(k=0;j<=9;k++){
hash[i]--;hash[j]--;hash[k]--;
if(hash[i]>0&&hash[j]>0&&hash[k]>0){
ret[(*returnSize)++]=i*100+j*10+k;
}
hash[i]++;hash[j]++;hash[k]++;

}
}
}
return ret;

}

#实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:   
1)读入字符串并丢弃无用的前导空格;   
2)检查下一个字符为正还是负号,读取该字符。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。   
3)读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数,如果没有读入数字,则整数为 0
4)如果整数超过 32 位有符号整数范围 [−2^{31}, 2^{31} − 1],需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^{31}的整数应该被固定为 −2^{31},大于 2^{31} 的整数应该被固定为 2^{31} − 1。   
返回整数作为最终结果。   
样例输入1: “+123”   
样例输出1: 123


样例输入2:"   -123"   
样例输出2: -123−123


样例输入3: “hahaha 996”   
样例输出3: 0


样例输入4:“-9231243283324473242332”,   
样例输出4: -2147483648


样例输入5: “-+1”   
样例输出5: 0

class solution{
public:
string trim(string s){//返回去掉空格的字符串
string ret;
int notEmptyIdx=s.size();//长度
for(int i=0;i<s.size();i++){
if(s[i]==" "){
continue;
}else{
notEmptyIdx=i;
break;
}
for(int i=notEmptyIdx;i<s.size();i++){
ret.push_back(s[i]);//往后插入元素的函数
}
return ret;
}
}
string postiveChect(string s){//去掉第一个为+
string ret;
for(int i=1;i<s.size();i++){
ret.push_back[s[i]];
}
return ret;
}
string negativeSplit(string s,int &flag){
if(s.size()==0){
flag=1;
return s;
}
if(s[0]='-'){
flag=-1;
string ret;
for(int i=1;i<s.size();i++){
ret.push_back(s[i]);
}
return ret;
}
flag=1;
return s;
}
}
int myAtoi(string s){
int flag=1;
long long sum=0;
s=trim(s);//删除空格
if(s.size()==0){
return 0;
}
if(s[0]=='+'){
s=positiveCheck(s);
}else if(s[0]='-'){
s=negativeSplit(s,flag);
}
long long minv = INT_MIN;
long long maxv = INT_MAX;
for(int i=0;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9'){
sum=sum*10+s[i]-'0';//这里累加为什么要乘10
if(sum * flag < minv) {
return minv;                      
}
if(sum * flag > maxv) {
return maxv;        
}else{//我感觉这里非法字符串判断有问题
break;
}
}
return sum*flag;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值