算法知识点汇总

来源:互联网 发布:excel数据模拟运算 编辑:程序博客网 时间:2024/06/10 20:44
1.求数组元素之间相邻的元素个数或者求字符串的长度:

指向同一个数组的不同元素的两个指针可以相减,其差便是两个指针之间相隔的元素个数。

例如在一个字符串中,让一个指向该串的首元素,让另一个指向字符串的结束符,两个指针相减,其差便是字符串的长度


2.怎样判断两个指针指向的是数组的同一个元素?

:指针可以互相比较。如指向同一个数组元素的两个指针可以比较,当两个指针相等时,说明指向数组的同一个元素。

 

3.怎样对二进制进行取位?

:and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。

 

4.怎样对二进制特定位赋值?

:按位或(or |):or运算通常用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。

 

5.可以使用%提取整数中的数字,用/将提取出的数字从整数中去掉。


6.判断一个字符是大写字母,小写字母,数字或者数字+大小写字母,用<cctype>头文件的字符检测函数,如下

C++提供了若干字符检测函数,这些函数都在头文件<cctype>.这些函数检测单个字符,返回true或者false(实际返回的是0和1)

Isdigit(c)//检测是否是为数字  如isdigit(‘7’)

Isalpha(c)//检测是否为字母  如isapha(‘a’)

Isalnum(c)//数字或者字母时候为真

Islower(c)//检测小写字母

Isupper(c)//

Isspace()//

 

 

7.怎样进行单个字符大小写转换?

tolower(c)//转换小写字母。否则返回本身

toupper(c)//转换为大写字母

注意:转换后的返回值并不是相应的大小写字母,而是大小写字母对应的ASCII码,所以,要转换为大小写字母,还需要进行类型转换,如

Char ch = ‘a’;

Cout<<static_cast<char>(toupper(ch));//显示A

如果为:cout<<toupper(ch)//则显示大写字母的ASCII码65


8.判断一年的第一天是星期几(用来打印日历)

int firstday = ((year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+1)%7; //判断某年的第一天是星期几(计算从1970到现在的天数,模7取余就是今天的星期)

daysofmonths是这个月的天数(123456789,10,11,12)

下个月第一天是星期几就是firstday = (firstday+daysOfMonths)%7;


9.找出符合条件的100个数(n个数):

将这些数放在一个数组中,先声明这个数组如:int num[100],n = 0;//n用于数组的计数作用


再筛选,可以自己设置一个开关,作为跳出循环的条件和执行符合情况的条件。

while(n<100)

{

            生成数,

             if(符合条件)

             {  num[n]= 这个数//将这个数插入到数组中

               n++;

              }

}

9.遇见多个一次出现数字,就要联想到数组,把这些数放在数组中,能一一访问。

有的情况下,输入的数,是临时的,可能会被立刻抛弃,这时候,就不用引入数组,直接用循环生成一下这个数。即只有要保存的数,要访问的数,有用的数才放在数组中

如int n  = 0;

while(n<10)

{

  a  = rand()%10;

if(满足条件才)

{才留下a}

}


10.输出10个不同的数,

算法:就是每次新输入的数,都与原来的所有数比较(因为要保存原来的数,所以必须把原来的数放在数组中,才能访问到这个数),如果没有相同的,则加入进去,否则丢弃。

(即只有要保存的数,要访问的数,有用的数才放在数组中)


11.遇见多个一次出现数字,就要联想到数组,把这些数放在数组中,能一一访问。

有的情况下,输入的数,是临时的,可能会被立刻抛弃,这时候,就不用引入数组,直接用循环生成一下这个数。即只有要保存的数,要访问的数,有用的数才放在数组中

如int n  = 0;

while(n<10)

{

  a  = rand()%10;

if(满足条件才)

{才留下a}

}


10设置”开关“的作用:若一个数符合条件,那么执行外面的动作,若不符合,则不执行外面的动作。原理就是当遇到不符合条件的数的时候,改变开关值。

和有条件跳出双重循环一样(不符合,跳出两层循环(内层用break退出,外层用continue,),符合,执行外层循环动作)

可表示为

int sw  = 0//开关  

for{

if(不符合条件)

{int sw = 1;break;  }

}

if(!sw){动作}

 

典型范例:输出10个不同的数

void main()
{
int num[10],n = 0;//将10个有用的数放在数组中,声明n作为数组访问下标变量。
srand(time(0));
num[0] = rand()%10;//因为后面的数要和前面的数相比,所以第一个必须是提前特殊声明好了得


n++;
int sw = 0;//引入的开关变量
while (n<10)
{
int a = rand()%10,i;

sw = 0;//注意,记住这里,一定要每次都将开关变量初始化为零,让其每次都发挥作用
for (i = 0;i<n;i++)
{
if (num[i] ==a)
{
  sw = 1;
break;
    
}//判断新数是否与以前数组中的数相同,如果相同,则退出
}


if(!sw)//这里修改为这样


{
num[n] = a;
n++;
}




}
for (int j  = 0;j<10;j++)
{
cout<<num[j]<<endl;
}//打印数组
}

下面这个程序是利用,退出两次循环的原理

void main()
{
int num[10],n = 0;
srand(time(0));
num[0] = rand()%10;
n++;

while (n<10)
{
  int a  = rand()%10,i;
for (i = 0;i<n-1;i++)
{
if (num[i] ==a)
{
              break;
}
}
if (num[i] == a)
{
continue;
}
else
{
num[n] = a;
n++;
}



}
for (int j = 0;j<10;j++)
{
cout<<setw(5)<<num[j]<<endl;
}
}




10.如何跳出双重循环?


for(;;){     for(;;)        {           if(跳出的条件)            break;         }    if(跳出的条件)    break;
}

11.如果不符合条件,跳出两次循环,如果满足条件,跳出内层循环,执行外层循环的动作。与引入开关变量一样(如果条件符合,则退出笨循环且执行外部动作,如果不符合,则不执行外部动作)

for(;;){     for(;;)        {           if(跳出的条件)            break;         }    if(跳出的条件)    continue;//跳出循环的一次迭代
else 
{
外层循环其他动作
}} 



原创粉丝点击