面试金

1、

#include<stdio.h>
#include<stdlib.h>
struct s
{
int a[2014];
int i;
}str;
int main(void)
{
for(str.i=0;str.i<=2014;str.i++)
{
str.a[str.i]=rand()%2014;
printf("%d\n",str.i);
}

return 0;
}


这段代码运行的结果会是什么?

答案是无限循环,原因其实很简单,我们应该注意到结构体,对结构体有所了解的人就会明白,结构体中的成员变量在内存中是连续的,同时还会注意到问题出在了str.i<=2014;

这条语句,如果换成str.i<2014就不会有问题了,也就是说赋的值超出了数组范围,多出了一个,而多出的这个数就直接付给了i 变量,所以有的人刚开始就想i 一直增大总会超出2014的,结构却不是这样,一到2014时,i 变成了(rand()%2014)这个小于2014的值,而不会是2015了。


相同的结构体问题:

#include<stdio.h> 
struct test 
{ 
  int i; 
  int j; 
}; 
int main() 
{ 
  struct test t; 
  t.i=1; 
  t.j=2; 
  printf("t:%d, i:%d, j:%d\n", t, t.i, t.j); 
} 
这个的答案  代码打印是:"t:1, i:2, j:1 "

 t 作为一个结构体名,它代表了所包含的所有的变量成员,并依此赋值给了前两个,t.i自然复制给了j,这样造成了我们的迷惑

2、关于数字反转法(采用递归法)

#include <iostream> 
using namespace std; 


void reverse(int n)
{
cout<<n%10;
if(n/10!=0)
reverse(n/10);
}
int main()
{ 
int n=123456;
reverse(n);
cout<<endl;

    return 0; 
}


这个递归方法还是比较容易理解,就是通过对10求余获得个位的数字


字符串反转(非递推):

#include<stdlib.h>
#include <iostream> 
using namespace std; 

void reverse(char *m)
{
	int len=strlen(m);
	char t;
	for(int i=0;i<(len-1)/2;i++)
	{
		t=m[i];
		m[i]=m[len-1-i];
		m[len-1-i]=t;
	}
}
int main()
{ 
	char str[]="minus";
	reverse(str);
	cout<<str<<endl;
    return 0; 
}



这个我感觉比数字反转简单了很多,因为这个只要把握住下标就行了


快排算法:

def qsort(arr):
    if len(arr) <= 1: return arr
    return qsort([x for x in arr if x < arr[0]]) + [x for x in arr if x == arr[0]] + qsort([x for x in arr if x > arr[0]])
if __name__=='__main__':
	a=[4,2,8,7,0,1,8,3]
	b=qsort(a)
	for i in b:
		print i
这是python版,非常简洁,也很好理解:每次递归都是将arr中比第一个小的放前面,接着放第一个,然后放比第一个大的就ok了。

#include<iostream>
using namespace std;
int x[11]={4,2,6,1,8,9,5,3,-9,0,7};

void change(int &x,int &y)
{
	int temp=x;
	x=y;
	y=temp;

}
void sqsort(int l,int u)
{
	if(u-l<0.01)
		return;
	int t=x[l];
	int i=l;
	int j=u+1;
	while(true)
	{
		do
		{
			i++;
		}while(i<=u && x[i]<t);
		do
		{
			j--;
		}while(x[j]>t&&j>l);
		if(i>=j)
			break;
		change(x[i],x[j]);
	}
	change(x[l],x[j]);
	sqsort(l,j-1);
	sqsort(j+1,u);
}
int main()
{
	for(int i=0;i<11;i++)
		cout<<x[i]<<"  ";
	sqsort(0,10);cout<<endl;
	for(int j=0;j<11;j++)
		cout<<x[j]<<"  ";
	getchar();
	return 0;
}

这是C++版本的快排,是最基础的方法,虽然相对于python代码量大,也相对容易理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值